2017-11-26 12 views
-1
public class Outer2 { 

Outer2(){ 
    System.out.println("Calling Outer2 constructor"); 
    System.out.println(this.getClass().getName() + ": Inner class reference is " + this); 
    System.out.println(Outer2.this + ": Outer class reference is " + Outer2.this); 
} 

class Inner1 extends Outer2 { 
    Inner1() { 
     System.out.println("Calling Inner1 constructor"); 
     System.out.println(this.getClass().getName() + ": Inner class reference is " + this); 
     System.out.println(Outer2.this + ": Outer class reference is " + Outer2.this); 
    } 
} 

class Inner2 extends Inner1 { 
    Inner2() { 
     System.out.println("Calling Inner2 constructor"); 
     System.out.println(this.getClass().getName() + ": Inner class reference is " + this); 
     System.out.println(Outer2.this + ": Outer class reference is " + Outer2.this); 
    } 
} 

public static void main(String[] args) { 
    new Outer2().new Inner2(); 
} 

}javaのネストしたクラスの内側と外側の参照が等しい

上記のコードは次のように出力できますなぜ誰かが説明することができます:

Calling Outer2 constructor 
outer2.Outer2: Inner class reference is [email protected] 
[email protected]: Outer class reference is [email protected] 
Calling Outer2 constructor 
outer2.Outer2$Inner2: Inner class reference is 
[email protected] 
[email protected]: Outer class reference is 
[email protected] 
Calling Inner1 constructor 
outer2.Outer2$Inner2: Inner class reference is 
[email protected] 
[email protected]: Outer class reference is [email protected] 
Calling Inner2 constructor 
outer2.Outer2$Inner2: Inner class reference is 
[email protected] 
[email protected]: Outer class reference is [email protected] 

私はなぜ、内側と外側のクラス参照に興味をOuter2スーパータイプのコンストラクタを2回目に呼び出すときと同じですか?

+0

他に何が必要ですか?作成するオブジェクトは2つだけです。 – Progman

+0

外部クラス参照は[email protected]ですが、それははっきりしています。しかし、Outer2コンストラクターが2回目に呼び出されたとき、Outer参照は異なります。それは私が得ないものです。 Inner1コンストラクターとInner2コンストラクターを呼び出すときは、内部参照と外部参照が意味を持ちます。内部と外部の参照を入れ替えた理由 – Daniel

答えて

1

Outer2コンストラクターでは、Outer2の内部クラスには属していません。だから、コンパイラのために、ライン

System.out.println(Outer2.this + ": Outer class reference is " + Outer2.this); 

System.out.println(Outer2.this + ": Outer class reference is " + this); 

と厳密に等価であるので、thisの値は、二度印刷されます。 thisは、実際には作成されているInner2オブジェクトへの参照であるため、[email protected]を出力します。

+0

ご協力ありがとうございます。それは理にかなっている。 – Daniel

関連する問題