2

2 つのサブクラス (CircleFromSimpleGeometricObject と RectangleFromSimpleGeometricObject) に拡張されたスーパークラス (SimpleGeometricObject) と、TestCircleRectangle と呼ばれる CircleFromSimpleGeometricObject と RectangleFromSimpleGeometricObject を呼び出すクラスがあります。サブクラス CircleFromSumpleGeometricObject のデバッガーに続いて、次のコード行を実行します。

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());
}

}
4

4 に答える 4

0

CircleFormSimpleGeometricObject は SimpleGeometricObject を拡張するため、コンストラクター CircleFormSimpleGeometricObject() が呼び出されると、コンストラクター SimpleGeometricObject() が自動的に呼び出されます。

サブクラスがスーパークラスから必要とするすべての変数が初期化されるため、これは便利ですが、この場合はスーパークラスのコンストラクターを明示的に呼び出す super() を呼び出す方が安全です。使用するコンストラクターを指定するために、特定のコンストラクターが呼び出す変数を super() に入れることができます。たとえば、次の行です。

    super(String, boolean);

SimpleGeometricObject で関連するコンストラクターを呼び出します。

于 2015-11-09T02:17:13.587 に答える