回顾Java中的继承和多态

时间:2013-04-27 04:49:41

标签: java inheritance polymorphism

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

无论如何,任何投入都表示赞赏。谢谢

1 个答案:

答案 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