1

サブクラスで同じプロパティを使用してスーパークラスで定義されたプロパティの値に関して、プロパティが保護されていると定義されている場合、スーパーまたはこれを使用しても違いはありませんか? では、なぜ言語にはプロパティにアクセスするこれらの方法があるのでしょうか? それらが異なる値を持つシナリオはありますか。

    class A{ protected int a = 15; 
    }

    class B{ 
    public void printA()
{
    System.out.print(super.a) // prints 15
    System.out.print(this.a) // prints 15
 }   

}

4

1 に答える 1

4

この状況では違いはありません。ただし、変数ではなくメソッドに変更し、のメソッドBをシャドウイングする別のメソッドA導入するとすぐに、違いが生じます。

class A { 
    protected int a = 15; 
}

class B extends A { 
    private int a = 10;

    public void printA() {
       System.out.println(super.a); // prints 15
       System.out.println(this.a); // prints 10
    }
}

ただし、これはフィールドよりもメソッドの方が一般的です。多くの場合、オーバーライドする実装では、実装の一部としてスーパークラスの実装を呼び出す必要があります。

public void foo() {
    super.foo();
    // Now do something else
}

個人的には、非プライベートフィールドを避けることをお勧めします。その時点で、フィールド部分は無関係になります。

シャドウイングの詳細については、JLSのセクション6.4.1を参照してください。

于 2012-08-07T20:23:05.163 に答える