2011-11-16 71 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