3

重複の可能性:
クラスのインスタンス変数を非表示にする

私はクラスの下にあります

AbstractTest

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が最初のケースと2番目のケースで出力されるのはなぜですか?5Test()

アップデート:

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

これはJLS15.11.1で定義されています

[式Primary.Identifier]では、実行時に参照される実際のオブジェクトのクラスではなく、プライマリ式のタイプのみが、使用するフィールドの決定に使用されます。

于 2012-09-12T11:00:44.477 に答える
1

変数は、クラスの参照に基づいて使用されます。したがって、AbstractTest参照が使用される場合、クラスtestVarから使用されます。AbstractTest

于 2012-09-12T10:54:54.397 に答える
1

1つの厳格なルール:

フィールドは参照型で使用され、メソッドは実際のオブジェクトで使用されます。

testはの参照でAbstractTestあるため、基本クラスフィールドが使用されます。

secondTestはの参照でderive classあるため、派生クラスフィールドが使用されます。

于 2012-09-12T10:55:16.550 に答える