好的,所以我的基本类层次结构如下:
抽象公共类形状--->公共类圆形
这是形状和圆的代码。无需阅读,仅供参考;不管怎样,大多数都是进攻型和二传型。如果我的错误不明显的话,我建议最后看一眼。
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;