2013-07-09 170 views
2

我有一个扩展到两个子类(CircleFromSimpleGeometricObject和RectangleFromSimpleGeometricObject)的超类(SimpleGeometricObject),以及一个调用CircleFromSimpleGeometricObject和RectangleFromSimpleGeometricObject的类,名为TestCircleRectangle。继调试,为子类CircleFromSumpleGeometricObject, 这行代码:Java超类继承

public CircleFromSimpleGeometricObject(double radius){ 
    this.radius = radius; 
} 

莫名其妙地调用超SimpleGeometricObject:

/** Construct a default geometric object */ 
public SimpleGeometricObject() { 
    dateCreated = new java.util.Date(); 
} 

我有点困惑如何发生以及为什么有人可以帮助我理解为什么发生这种情况以下是所有课程的代码。

public class SimpleGeometricObject { 
private String color = "white"; 
private boolean filled; 
private java.util.Date dateCreated; 

/** Construct a default geometric object */ 
public SimpleGeometricObject() { 
    dateCreated = new java.util.Date(); 
} 

/** Construct a geometric object with the specified color 
* and filled value */ 
public SimpleGeometricObject(String color, boolean filled) { 
    dateCreated = new java.util.Date(); 
    this.color = color; 
    this.filled = filled; 
} 

/** Return color */ 
public String getColor() { 
    return color; 
} 

/** Set a new color */ 
public void setColor(String color) { 
    this.color = color; 
} 

/** Return filled. Since filled is boolean, 
    its get method is named isFilled */ 
public boolean isFilled() { 
    return filled; 
} 

/** Set a new filled */ 
public void setFilled(boolean filled) { 
    this.filled = filled; 
} 

/** Get dateCreated */ 
public java.util.Date getDateCreated() { 
    return dateCreated; 
} 

/** Return a string representation of this object */ 
public String toString() { 
    return "created on " + dateCreated + "\ncolor: " + color + 
     " and filled: " + filled; 
} 
} 


public class CircleFromSimpleGeometricObject 
extends SimpleGeometricObject { 
private double radius; 

public CircleFromSimpleGeometricObject() { 

} 

public CircleFromSimpleGeometricObject(double radius){ 
    this.radius = radius; 
} 

public CircleFromSimpleGeometricObject(double radius, 
     String color, boolean filled) { 
    this.radius = radius; 
    setColor(color); 
    setFilled(filled); 
} 

/** Return radius */ 
public double getRadius() { 
    return radius; 
} 

/** Set a new radius */ 
public void setRadius(double radius) { 
    this.radius = radius; 
} 

/** Return area */ 
public double getArea() { 
    return radius * radius * Math.PI; 
} 

/** Return diameter */ 
public double getDiameter() { 
    return 2 * radius; 
} 

/** Return perimeter */ 
public double getPerimeter() { 
    return 2 * radius * Math.PI; 
} 

/** Print the circle info */ 
public void printCircle() { 
    System.out.println("The circle is created " + getDateCreated() + 
      " and the radius is " + radius); 
} 
} 



public class RectangleFromSimpleGeometricObject 
extends SimpleGeometricObject { 
private double width; 
private double height; 

public RectangleFromSimpleGeometricObject() { 
} 

public RectangleFromSimpleGeometricObject(
     double width, double height) { 
    this.width = width; 
    this.height = height; 
} 

public RectangleFromSimpleGeometricObject(
     double width, double height, String color, boolean filled) { 
    this.width = width; 
    this.height = height; 
    setColor(color); 
    setFilled(filled); 
} 

/** Return width */ 
public double getWidth() { 
    return width; 
} 

/** Set a new width */ 
public void setWidth(double width) { 
    this.width = width; 
} 

/** Return height */ 
public double getHeight() { 
    return height; 
} 

/** Set a new height */ 
public void setHeight(double height) { 
    this.height = height; 
} 

/** Return area */ 
public double getArea() { 
    return width * height; 
} 

/** Return perimeter */ 
public double getPerimeter() { 
    return 2 * (width * height); 
} 

} 


public class TestCircleRectangle { 
public static void main(String[] args) { 
    CircleFromSimpleGeometricObject circle = 
      new CircleFromSimpleGeometricObject(1); 
    System.out.println("A circle " + circle.toString()); 
    System.out.println("The color is " + circle.getColor()); 
    System.out.println("The radius is " + circle.getRadius()); 
    System.out.println("The area is " + circle.getArea()); 
    System.out.println("The diamter is " + circle.getDiameter()); 

    RectangleFromSimpleGeometricObject rectangle = 
      new RectangleFromSimpleGeometricObject(2, 4); 
    System.out.println("\nA rectangle " + rectangle.toString()); 
    System.out.println("The area is " + rectangle.getArea()); 
    System.out.println("The perimeter is " + 
     rectangle.getPerimeter()); 
} 

} 
+1

我将简化那些名字;好名字很重要。我不明白为什么Circle,Rectangle和AbstractShape不足够。 – duffymo

+0

默认情况下,子类调用超类构造函数。你可以通过调用super –

回答

4

public CircleFromSimpleGeometricObject(double radius)构造函数总是必须包括它的父类的构造函数作为第一线的呼叫;如果你没有明确地做,编译器会无形的插入一个对超类的无参数构造函数的调用,如果有的话。这就是发生在这里的事情;构造函数自动调用public SimpleGeometricObject()

构造函数可以调用父类的构造是这样的:

super(); 

你可以包括参数,如果有的话是必需的。

P.S.作为一位评论者提到,你的班级名称非常奇怪而且没有必要; CircleRectangle就足够了。

+0

来明确地调用它,非常感谢。我花了很多时间试图弄清楚发生了什么。 –

0

任何构造函数调用超类构造函数(依此类推,直到调用Object构造函数为止)。如果您没有明确地调用super(),则编译器将为您插入它。

看到这个最明显的方法是在你的超类中没有默认构造函数(没有没有任何参数的构造函数)。在这种情况下,除非您插入对所需super构造函数的明确调用,否则子类将不会编译。

0

由于CircleFormSimpleGeometricObject延伸SimpleGeometricObject,构造SimpleGeometricObject()自动构造CircleFormSimpleGeometricObject()被调用时调用。

这很有用,因为子类需要从超类中得到的任何变量都会被初始化,但如果是这样的话,调用超类的构造函数super()会更安全。要指定要使用哪个构造函数,可以将特定构造函数要求的变量放入super()中。例如,以下行:

super(String, boolean); 

将调用SimpleGeometricObject中的相关构造函数。