2012-08-11 104 views
1

我不明白這一點:覆蓋方法,爲什麼我不能參考新的自己的方法?

OnGlobalLayoutListener listener = new OnGlobalLayoutListener() { 
    @Override 
    public void onGlobalLayout() { 
     System.out.println("I am override a method"); 
    } 

    public void hello(){ 
     System.out.println("This is a new method"); 
    } 
}; 

//listener.hello(); Why I cannot do it? 

沒有這個我能做到這一點:

new OnGlobalLayoutListener() { 
     @Override 
     public void onGlobalLayout() { 
      System.out.println("I am override a method"); 
     } 

     public void hello(){ 
      System.out.println("This is a new method"); 
     } 
    }.hello(); 

爲什麼在第一種情況下我不能調用方法你好()和第二種情況下我可以做它?

+0

相同的問題 http://stackoverflow.com/questions/10800678/can-i-access-new-methods-in-anonymous-inner-class-with-some-syntax – Lesiak 2012-08-11 12:12:35

回答

3

您正在創建一個新的匿名類型,並使用一種名爲hello的新方法。

您可以表達new OnGlobalLayoutListener() { }調用hello因爲表達的類型是新的匿名類型。

可以listener通話hello因爲listener的編譯時類型爲OnGlobalLayoutListener,其中沒有一個hello方法。

如果你想添加額外的方法,我個人建議你在你的當前類中創建一個新的嵌套類。你可以在一個方法中聲明一個新的命名類,但我不會建議它,只是在它創建的混亂方面。

請注意,重寫onGlobalLayout與問題完全無關。你會看到同樣的事情,如果你試着寫:

new Object { 
    public void hello() { ... } 
} 
1

在這兩種情況下,通過創建一個anonymous inner class實例化一個對象,但你引用的方式hello()方法不同:

在第一種情況下, ,您將實例化的類分配給OnGlobalLayoutListener接口的引用。問題在於界面沒有聲明hello()方法,所以無法調用。但是,如果您嘗試撥打onGlobalLayout(),則沒有問題。

在第二種情況下,hello()方法是可訪問的,因爲您將其稱爲參考剛剛實例化。與接口相反,該類有兩種方法,即覆蓋onGlobalLayout()和請求的hello()方法。

相關問題