2011-11-16 14 views
5

Il seguente programma utilizza una classe interna denominata Anonymous che estende la sua classe di inclusione Main.Una classe interna distorta in 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(); 
    } 
} 

L'unica affermazione nel metodo main() invoca il costruttore della classe esterna Main fornendo una stringa principale e solo allora il metodo reproduce() viene chiamato.


Il reproduce method contiene la dichiarazione new Anonymous().printName();, che richiama il metodo printName() sull'oggetto Anonymous di classe. Il costruttore super(); sta fornendo una nuova stringa riproducendo alla sua super classe che include Main.


Pertanto, l'istruzione all'interno del metodo printNameSystem.out.println(name()); dovrebbe visualizzare la stringa riprodurre anziché principale ma visualizza sempre la stringa principale. Perché è così?

risposta

16

Perché hai dichiarato Main.name() come private, quindi non è visibile come metodo di superclasse. È, tuttavia, visibile come metodo della classe di inclusione di Anonymous, quindi viene richiamato sull'oggetto che lo racchiude.

Quindi se si dichiara Main.name() come public o protected, si vedrà effettivamente "reproduce". In alternativa, se si dichiara staticAnonymous, non viene più compilato.

+0

+1 Ben individuato. – skaffman

Problemi correlati