3

ここで理解できるように、「a1」は属性として「a=200」を持つクラス B オブジェクトを参照しています。したがって、プログラムは 200 を出力すると予想していましたが、なぜこのプログラムは 200 ではなく 100 を出力するのでしょうか?

    class A{
        int a=100;
    }

    class B extends A{
        int a=200;

    }

    class Demo{
        public static void main(String args[]){
            A a1=new B(); 
            System.out.println("a : "+a1.a); //Prints 100  
        }
    }
4

2 に答える 2

9

B親クラスのフィールドと同じ名前を持つクラスのフィールドを宣言することにより、A本質的にそのフィールドを非表示にします。ただし、変数のフィールド アクセスは、その変数の宣言型/静的型に基づいて行われます。

つまり、フィールドはメソッドのような多態的なエンティティではありません。

この場合、変数a1は type として宣言されAます。したがって、アクセスされるフィールドは、親クラスのフィールドになりますA

于 2013-09-17T14:56:12.480 に答える
4

ドキュメントの発言

クラス内で、スーパークラスのフィールドと同じ名前のフィールドは、型が異なっていても、スーパークラスのフィールドを隠します。サブクラス内では、スーパークラスのフィールドを単純な名前で参照することはできません。代わりに、スーパーを介してフィールドにアクセスする必要があります

あなたの場合、スーパーカルスによって隠されているa クラスのフィールドBA

値を取得したい場合は、

class Demo{
    public static void main(String args[]){
        A a1=new B(); 
        System.out.println("a : "+a1.a); //Prints 200  
    }
}
class A{
    int a=100;
}

class B extends A{
     public B() {
        super.a=200;
    }

}
于 2013-09-17T14:55:33.627 に答える