我正在学习决赛,我遇到了一个处理理解继承和多态的示例问题。我必须解释每一行是否会产生编译器错误(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();
这条线很好,因为你正在创建一个看起来像矩形的形状,因为Rectangle扩展了Shape。但是,在这种情况下,s只能访问类Shape中的方法(如果存在重叠的方法或构造函数,它通常会从Rectangle类中访问其他方法)。这条线很好(F)。
Rectangle r = (Rectangle)s;
我很难理解这一行,但我认为这条线也很好(F),因为你正在将s Shape转换为Rectangle。也就是说,Shape s也可以使用Rectangle类中的方法,与上面的行不同。
Rectangle r2 = s;
在这里,您将s转换为Rectangle。这将导致编译器错误(C),因为您无法将父类(s是类Shape的对象)强制转换为它的子类(类Rectangle)
Rectangle[] rar = new Rectangle[1];
这一行很好(F),因为你只是创建一个名为rar的数组,其长度为2。
s.setS1(3.0);
由于Rectangle类中的方法setS1没有限制。并且因为s能够访问类Rectangle,因为我们从行Rectangle r = (Rectangle)s;
转换为一种Rectangle类型,这条线也很好(F)。
s.computeArea();
此行将导致运行时错误(R),因为computeArea方法为null,因为区域从未初始化?我不确定这个。
rar[0].computeArea();
这里的线路可以正常工作(F)。但是在computeArea中没有任何内容,因为s1和s2尚未初始化。
无论如何,任何投入都表示赞赏。谢谢
答案 0 :(得分:0)
Shape s = new Rectangle(); // Works fine
Rectangle r = (Rectangle)s; // Works fine
Rectangle r2 = s; // Needs typecasting, Compile fail
Rectangle[] rar = new Rectangle[1]; // Fine, array of length 1
s.setS1(3.0); // Shape doesn't know about setS1(), compile fail
s.computeArea(); // Works fine, though abstract method, known that an solid class has to implement
rar[0].computeArea(); // Run time NullPointerException, rar[0] not initialized
r.s1 = 4.5; // s1 is private, compile error
r.setS1(5.0); // works fine
r.setS2(3.0); // works fine
s.getArea(); // works fine
System.out.println(r.computeArea()); // Can't print void method, compile error
r = null; // Works fine
rar[1] = new Rectangle(); // Runtime ArrayIndexOutOfBoundsException, your array size is 1
System.out.println(Rectangle.name); // Works fine