2011-11-16 43 views
5

El siguiente programa usa una clase interna llamada Anonymous que a su vez amplía su clase incluida Main.Una clase interna retorcida en 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(); 
    } 
} 

La única declaración en el método main() invoca el constructor de la clase externa Main suministro de una cadena principal y justo entonces el método reproduce() está siendo llamado.


El reproduce method figura la declaración de new Anonymous().printName(); que invoca el método en el objeto printName()Anonymous clase. El constructor super(); está suministrando una nueva cadena , que reproduce en su superclase adjunta Main.


En consecuencia, la declaración dentro del método printNameSystem.out.println(name()); debe mostrar la cadena reproducir en lugar de principal pero siempre muestra la cadena principal . ¿Por que es esto entonces?

Respuesta

16

Porque ha declarado Main.name() como private, por lo que no es visible como un método de superclase. Sin embargo, es visible como un método de la clase adjunta Anonymous, por lo que se invoca en el objeto adjunto.

Así que si se declara como Main.name()public o protected, que de hecho se vea "reproduce". Alternativamente, si declara Anonymous como static, ya no se compila.

+0

+1 Bien manchado. – skaffman

Cuestiones relacionadas