2010-09-28 43 views
6
class A { public static void main(String[] args) 
{ A a = new A(); 
    B b = new B(); 
    A ab = new B(); 
    System.out.format("%d %d %d %d %d %d", a.x, b.x, ab.x, a.y, b.y, ab.y); } 
    int x = 2; 
    int y = 3; 
    A(int x) { this.x = x; } 
    A() { this(7); } } 

class B extends A { 
    int y = 4; 
    B() { super(6); 
    } 

嘿,我只是希望通过从我的过程中的一些例子,碰到这个问题难倒我来了。
我意识到 此代码应打印出 “7 6 6 3 4 3”真正VS表观Java中的类

但为什么ab.y等于3?不是B类的“真实”类型的对象ab? 那么这会导致我相信ab.y是4?

回答

8

因为您直接访问字段,而不是通过getter方法。

您不能覆盖字段,只能使用方法

类别B除父级A之外还有一个字段y。这两个字段不会互相干扰,哪一个字段会在编译时确定(通过编译器已知的类型)。

如果你说

A ab = new B(); 

然后

ab.y 

将被编译到看看A类声明的字段y。这不会在运行时分派给实际的实例类。这与静态方法是一样的。

如果你

B ab = new B(); 

然后你在B类领域。

+0

好吧,清除它很多,谢谢! – 2010-09-28 02:02:40