2011-11-16 8 views
5

Następujący program używa wewnętrznej klasy o nazwie Anonymous, która sama rozszerza swoją klasę obejmującą Main.Skręcona klasa wewnętrzna w języku Java

package name; 

public class Main 
{ 
    private final String name; 

    Main(String name) 
    { 
     this.name = name; 
    } 

    private String name() 
    { 
     return name; 
    } 

    private void reproduce() 
    { 
     new Anonymous().printName(); 
    } 

    private class Anonymous extends Main 
    { 
     public Anonymous() 
     { 
      super("reproduce"); 
     } 

     public void printName() 
     { 
      System.out.println(name()); 
     } 
    } 

    public static void main(String[] args) 
    { 
     new Main("main").reproduce(); 
    } 
} 

Jedyne oświadczenie w głównej() metoda wywołuje konstruktor klasy zewnętrznej Main dostarczającego ciąg główny i tylko wtedy metoda reproduce() jest nazywany.


The reproduce method zawiera oświadczenie new Anonymous().printName(); który wywołuje metodę printName() na obiekcie Anonymous klasy. Konstruktor super(); dostarcza nowy ciąg odtwarzający do swojej superklasy klasy Main.


W związku z tym stwierdzenie w sposób printNameSystem.out.println(name()); powinien wyświetlać ciąg rozmnażać zamiast głównej ale zawsze wyświetla ciąg główny. Dlaczego tak jest?

Odpowiedz

16

Ponieważ zadeklarowano Main.name() jako private, więc nie jest to widoczne jako metoda nadklasy. Jest on jednak widoczny jako metoda klasy zamykającej Anonymous, więc jest wywoływany na otaczającym obiekcie.

Więc jeśli zadeklarujesz Main.name() jako public lub protected, zobaczysz naprawdę "reproduce". Alternatywnie, jeśli zadeklarujesz Anonymous jako static, to nie będzie już kompilacji.

+0

+1 Dobrze zauważony. – skaffman