2016-04-12 5 views
1
public class ShadowTest 
{ 

    public int x = 0; 

    class FirstLevel 
    { 
     { // here not able to understand why it allows. 

      x = 1; 
     } 

     void methodInFirstLevel() 
     { 
      System.out.println("x = " + x); 
      // System.out.println("this.x = " + this.x); 
      System.out.println("ShadowTest.this.x = " + ShadowTest.this.x); 
     } 
    } 

    public static void main(String... args) 
    { 
     ShadowTest st = new ShadowTest(); 
     ShadowTest.FirstLevel fl = st.new FirstLevel(); 
     fl.methodInFirstLevel(); 
    } 
} 

私はなぜかっこが付いていないのはなぜか、括弧の意味は何ですか?詳しく説明してください。このInnerClassコンセプトの作業

+1

[この質問](http://stackoverflow.com/questions/1563030/anonymous-code-blocks-in-java)をご覧ください。 – blafasel

+0

"それは動作しません"問題の説明ではありません。どのような*具体的な方法ではうまくいかないのですか? – Raedwald

答えて

1

括弧を削除すると宣言として扱われ、外側が同じ名前の変数を持つため、内部クラスにxを再度宣言することができないためです。

{}にあると、インスタンスを作成して実行するときに初期化ブロックと見なされる原因となります。

0

基本的にコンストラクタと見なされます。あなたは、Javaに新しいですので、あなたはここにhttp://www.javatpoint.com/constructor

0

にコンストラクタについて

public class ShadowTest { 

public int x = 0; 

class FirstLevel 
{ 

    FirstLevel()  //Adding a proper costructor 
    {    // here not able to understand why it allows. 

     x = 1; 
    } 

    void methodInFirstLevel() 
    { 
     System.out.println("x = " + x); 
     // System.out.println("this.x = " + this.x); 
     System.out.println("ShadowTest.this.x = " + ShadowTest.this.x); 
    } 
} 

public static void main(String... args) 
{ 
    ShadowTest st = new ShadowTest(); 
    ShadowTest.FirstLevel fl = st.new FirstLevel(); 
    fl.methodInFirstLevel(); 
} 
} 

チェックとしてそれを書くならば、これはあなたに意味をなさないだろうことがあります場合は大括弧はインスタンスブロックから削除され、宣言状態になります。あなたはすでに外部クラスメンバーと同じ変数xを持っています。他の名前で変数を宣言すると、それが可能になります。

関連する問題