Java:上行对象是否使用超类或子类的重写方法



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

抽象公共类形状--->公共类圆形

这是形状和圆的代码。无需阅读,仅供参考;不管怎样,大多数都是进攻型和二传型。如果我的错误不明显的话,我建议最后看一眼。

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

由此可以清楚地看出,第一个print命令引用了toString的圆形版本。然而,我无法解释为什么接下来的两个打印命令引用了getArea或getPerimeter的Shape版本;这看起来很矛盾!两个类都有一个重写的方法,那么为什么一个引用circle方法,一个引用Shape方法呢?此外,如果toString()方法在圆上工作,为什么getRadius()方法不能在没有错误的情况下执行?

您的Circle构造函数有一个错误(导致您而不是初始化radius)。这个

radius = this.radius;

应该是

this.radius = radius;

相关内容

  • 没有找到相关文章

最新更新