这是我写的三个类:
public class Shape {
public int x = 0;
public void getArea() {
System.out.println("I don't know my area!");
}
public String toString() {
return "I am a shape!";
}
public int getX() {
return x;
}
}
public class Rectangle extends Shape {
public int x = 1;
public int getX() {
return x;
}
public void getArea() {
System.out.println("L*W");
}
public String toString() {
return "I am a rectangle!";
}
}
public class Tester {
public static void main(String[] args) {
Shape s = new Shape();
Rectangle r = new Rectangle();
System.out.println(r);
System.out.println(r.x + "\n");
s = r;
System.out.println(s);
s.getArea();
System.out.println(s.x);
System.out.println(s.getX());
}
}
Tester 类的 main 方法的输出是:
我是长方形! 1 我是长方形! 长*宽 0 1
为什么 sx 返回 0 而不是 1?因为变量的当前实例不是 Rectangle 并且该类也声明了相同的实例变量,或者 Rectangle 类中的变量没有覆盖 Shape 类中以前的公共 x 变量,就像它对 getX() 所做的那样矩形类中的方法因此返回 1?
同样作为一般规则,超类只有在该类中也声明了其子类方法时才能访问其实现?这是因为编译器将看到具有相同签名的相同数量的方法在“Shape”类中(具有重写的 Rectangle 实现)并接受这些作为有效的 Shape 方法?
提前致谢,