0

我正在为期末考试而学习,我遇到了一个关于理解继承和多态性的示例问题。我必须解释每一行是否会产生编译器错误(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 尚未初始化。

无论如何,任何输入都会受到赞赏。谢谢

4

1 回答 1

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
于 2013-04-27T04:57:33.413 回答