Java:一个upcasted对象是否使用超类或子类的重写方法?

时间:2015-12-28 23:17:26

标签: polymorphism abstract-class upcasting

好的,我的基本类层次结构如下:

抽象公共类Shape --->公共课圈。

以下是形状和圆的代码。无需阅读,仅供参考;无论如何,大多数是吸气剂和二传手。如果我的错误不明显,我会建议最后查看它们。

abstract public class Shape {

    protected String color;
    protected boolean isFilled;

    public Shape() {
        color = "green";
        isFilled = true;
    }

    public Shape(String color, boolean isFilled) {
        this.color = color;
        this.isFilled = isFilled;
    }

    public String toString() {
        String filledString = (isFilled)? "is filled in." : "is not filled in.";
        return "A Shape of " + color + " color that " + filledString;
    }

    public String getColor() {
        return color;
    }

    public boolean getIsFilled() {
        return isFilled;
    }

    public boolean isFilled() {
        return isFilled;
    }

    public void setColor(String color) {
        this.color = color;
    }

    public void setIsFilled(boolean isFilled) {
        this.isFilled = isFilled;
    }

    abstract public double getArea();
    abstract public double getPerimeter();
}

和圆圈类。

public class Circle extends Shape {           // save as "Circle.java"
    protected double radius;

    public Circle() {
        radius = 1.0;
    }

    public Circle(double radius, String color, boolean isFilled) {
        super(color, isFilled);
        radius = this.radius;
    }

    // A public method for computing the area of circle
    @Override
    public double getArea() {
        return radius*radius*Math.PI;
    }

    @Override
    public double getPerimeter() {
        return 2 * Math.PI * radius;
    }

    public double getRadius() {
        return radius;
    }

    @Override
    public String toString() {
        return ("Radius: " + radius);
    }

    public void setRadius(double radius) {
        this.radius = radius;
    }
}

我的问题与以下代码执行的结果有关:

public class TestShapes
{
    public static void main(String... args)
    {
        Shape s1 = new Circle(5.5, "RED", false);  // Upcast Circle to Shape
        System.out.println(s1);                    // which version? 
        System.out.println(s1.getArea());          // which version? 
        System.out.println(s1.getPerimeter());     // which version? 
        System.out.println(s1.getColor());
        System.out.println(s1.isFilled());
        // System.out.println(s1.getRadius());     // why doesn't this work?
    }
}

注意:抱歉代码量很大;我只是不知道抽象类是否有些奇怪,或者是误解的真正根源。

我无法获得输出,其中包含:

Radius: 0.0
0.0
0.0
RED
false

由此可见,第一个打印命令显示为toString的圆形版本。但是,我无法解释为什么接下来的两个打印命令引用了getArea或getPerimeter的Shape版本;这似乎是一个矛盾!这两个类都有一个重写方法,那么为什么一个引用circle方法而一个引用Shape方法呢?此外,如果toString()方法在圆上工作,为什么getRadius()方法会在没有错误的情况下执行?

1 个答案:

答案 0 :(得分:0)

您的Circle构造函数存在错误(导致您 初始化 radius)。此

radius = this.radius;

应该是

this.radius = radius;