2011-11-16 59 views
5

以下程序使用名为Anonymous的内部类,该类本身扩展其封闭类MainJava中扭曲的内部类

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

在main()方法的唯一语句调用外部类Main的构造供给串和刚则方法reproduce()被调用。


reproduce method包含调用Anonymous类对象上的printName()方法语句new Anonymous().printName();。构造函数​​正在提供一个新的字符串重现为其封闭的超类Main


因此,System.out.println(name());应显示该字符串printName方法中的语句再现而非但它总是显示字符串。为什么这样?

回答

16

因为您宣称Main.name()private,所以它不可见作为超类方法。但是,它作为Anonymous的封闭类的方法可见,所以它在封闭对象上被调用。

因此,如果您声明Main.name()publicprotected,那么您确实会看到"reproduce"。 或者,如果您声明Anonymousstatic,则不再编译。

+0

+1斑点。 – skaffman