好的,我的基本类层次结构如下:
以下是形状和圆的代码。无需阅读,仅供参考;无论如何,大多数是吸气剂和二传手。如果我的错误不明显,我会建议最后查看它们。
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()方法会在没有错误的情况下执行?
答案 0 :(得分:0)
您的Circle
构造函数存在错误(导致您不 初始化 radius
)。此
radius = this.radius;
应该是
this.radius = radius;