2016-04-12 4 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(); 
    } 
} 

Ich bin nicht klar warum, ohne Klammern, es funktioniert nicht und was die Bedeutung der Klammern ist? Bitte erläutern Sie ausführlich.Funktion dieses InnerClass-Konzepts

+1

Werfen Sie einen Blick auf [diese Frage] (http://stackoverflow.com/questions/1563030/anonymous-code-blocks-in-java). – blafasel

+0

"Es funktioniert nicht" ist keine Problembeschreibung. In welcher * spezifischen * Weise funktioniert es nicht? – Raedwald

Antwort

1

Weil, wenn Sie die Klammern entfernen, es als eine Deklaration betrachtet wird und Sie die x mit in der inneren Klasse nicht wieder deklarieren können, da die äußere die Variable mit demselben Namen haben.

Es ist erlaubt mit in der {} Ursache, die als ein Initialisierungsblock betrachtet, wenn Sie eine Instanz erstellen, die ausgeführt wird.

0

Es wird dort grundsätzlich als Konstruktor betrachtet. Da Sie Java neu sind können diese für Sie Sinn machen, wenn Sie es als

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(); 
} 
} 

prüfen zu Konstruktoren Wenn Sie hier http://www.javatpoint.com/constructor

0

schreiben Entfernt die Klammern dann von Instanz-Block wird es Deklarationsstatus werden. Sie haben bereits die gleiche Variable x als äußeres Klassenmitglied. Wenn Sie die Variable mit einem anderen Namen deklarieren, könnte dies möglich sein.

Verwandte Themen