2016-05-30 7 views
0

私は、抽象クラスをインスタンス化できないことを理解します。それでも、以下に示すようなコードを書くと、抽象的な親のサブクラスのインスタンスを生成します。 Javaの仕様によると、サブクラスオブジェクトはその親privateメンバーにアクセスできません。Do anonymous concreteサブクラスは抽象親プライベートフィールドを継承しますか?

匿名サブクラスオブジェクトが、抽象親クラスのプライベートフィールドに、 "i"に格納された値を出力することでアクセスできないということは私に困惑しています。どのような誤解がありますか?

public class Main { 

public static void main (String [] args){ 


    B myB = new B() {}; 
    myB.print(); 


}} 


public abstract class B { 

private int i = 5; 

public void print(){ 
    System.out.println(i); 
}} 

答えて

4

iBの方法でアクセスされているように、これは、完全に大丈夫です。 print()が別のクラスのコードによって呼び出されているということは問題ではありません。可視性変更子はに直接的にのみアクセスします。

(あなたがこれを表示するために匿名のサブクラスを必要としない、あなたは具体的なクラスと同じ効果を見ているでしょう。)

これは、カプセル化が動作するようになっている方法です:それは異なるため非常に困難だっただろうプライベートフィールドを使用する他のクラスのメソッドを呼び出せなかった場合に、互いに生産的な方法で相互に使用することができます。 Bは、publicメソッドを実装して、プライベートフィールドが呼び出されたメソッドによって悪影響を受けないようにする必要があります。

+0

ありがとうございました! – mowienay

関連する問題