3

可能重复:
隐藏类的实例变量

我有以下课程

抽象测试

public abstract class AbstractTest {
 protected int testVar = 10;
}

测试

public class Test extends AbstractTest {
int testVar = 5;

public static void main(String[] args) {
    AbstractTest test = new Test();
    System.out.println(test.testVar);//Prints 10

    Test secondTest = new Test();
    System.out.println(secondTest.testVar);//Prints 5
}
}

为什么上面的程序打印10第一种情况和5第二种情况,尽管它是同一类的对象,即Test()

更新:

I am now confused about how memory is allocated to Object and its variables. As instance variable is getting changed based on Class which is behaviour of Static?

更新:1

Every object will have two variables so question of same memory allocation does not comes in to picture. Thanks.

4

3 回答 3

2

这在JLS 15.11.1中定义

[在表达式中Primary.Identifier],只有主表达式的类型,而不是在运行时引用的实际对象的类,用于确定使用哪个字段。

于 2012-09-12T11:00:44.477 回答
1

一条硬性规定:

字段用于引用类型,而方法用于实际对象。

test是 的引用AbstractTest,所以使用基类字段。

secondTest是 的引用derive class,因此使用派生类字段。

于 2012-09-12T10:55:16.550 回答
1

该变量是根据类的引用使用的。因此,当AbstractTest使用参考时testVar,从AbstractTest类中使用。

于 2012-09-12T10:54:54.397 回答