我正在为期末考试而学习,我遇到了一个关于理解继承和多态性的示例问题。我必须解释每一行是否会产生编译器错误(C),运行时错误(R),或者它是否运行良好(F)。我写下并解释了每一行的结果,但我希望有人提供或指出我在答案中的错误,并可能纠正我的误解。
给定以下类:
public abstract class Shape{
protected double area;
public double getArea(){
return area;
}
public abstract void computeArea();
}
.
public class Rectangle extends Shape{
private double s1,s2;
public static String name="Rectangle";
public void setS1(double s1){
this.s1 = s1;
}
public void setS2(double s){
s2 = s;
}
public void computeArea(){
area = s1*s2;
}
}
.
public class TestRectComp{
public static void main(String[] args){
Shape s = new Rectangle();
Rectangle r = (Rectangle)s;
Rectangle r2 = s;
Rectangle[] rar = new Rectangle[1];
s.setS1(3.0);
s.computeArea();
rar[0].computeArea();
r.s1 = 4.5;
r.setS1(5.0);
r.setS2(3.0);
s.getArea();
System.out.println(r.computeArea());
r = null;
rar[1] = new Rectangle();
System.out.println(Rectangle.name);
}
}
这是我写的:
Shape s = new Rectangle();
这条线很好,因为您正在创建一个看起来像矩形的形状 s,因为 Rectangle 扩展了 Shape。但是,在这种情况下,s 只能访问 Shape 类的方法(如果有重写的方法或构造函数,它通常会访问 Rectangle 类的其他方法)。这条线很好(F)。
Rectangle r = (Rectangle)s;
我很难理解这条线,但我认为这条线也很好(F),因为你正在将 s Shape 向下转换为 Rectangle。也就是说,Shape 也可以使用类 Rectangle 中的方法,这与上面的行不同。
Rectangle r2 = s;
在这里,您将 s 转换为 Rectangle。这将导致编译器错误 (C),因为您不能将父类(s 是 Shape 类的对象)转换为它的子类(Rectangle 类)
Rectangle[] rar = new Rectangle[1];
这条线很好 (F),因为您只是创建了一个长度为 2 的名为 rar 的数组。
s.setS1(3.0);
由于类 Rectangle 中的方法 setS1 没有限制。并且由于 s 能够访问类 Rectangle,因为我们从该行转换为 Rectangle 类型,Rectangle r = (Rectangle)s;
该行也可以(F)。
s.computeArea();
此行将导致运行时错误 (R),因为 computeArea 方法为 null,因为 area 从未初始化?我不确定这个。
rar[0].computeArea();
在这里,这条线可以正常工作(F)。然而,computeArea 中没有任何内容,因为 s1 和 s2 尚未初始化。
无论如何,任何输入都会受到赞赏。谢谢