[英]Override method, why can't I referenciate new own methods?
我不明白這個:
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();
為什么在第一種情況下我不能調用方法hello()和第二種情況我能做到嗎?
您正在使用名為hello
的新方法創建一個新的匿名類型。
您可以在表達式new OnGlobalLayoutListener() { }
上調用hello
,因為該表達式的類型是您的新匿名類型。
你可以不叫hello
的listener
因為編譯時類型listener
是OnGlobalLayoutListener
,其中沒有一個hello
方法。
如果你想添加額外的方法,我個人建議你在當前類中創建一個新的嵌套類。 你可以在一個方法中聲明一個新的命名類,但我不建議它,只是根據它創建的混亂。
請注意, onGlobalLayout
的覆蓋與問題完全無關。 如果你嘗試寫作,你會看到同樣的事情:
new Object {
public void hello() { ... }
}
在這兩種情況下,您都可以通過創建匿名內部類來實例化對象,但引用hello()
方法的方式有所不同:
在第一種情況下,將實例化的類分配給OnGlobalLayoutListener
接口的引用。 問題是接口沒有聲明hello()
方法,因此無法調用它。 但是,如果您嘗試調用onGlobalLayout()
,則沒有問題。
在第二種情況下,可以訪問hello()
方法,因為您在剛剛實例化的類的引用上調用它。 與接口相比,該類有兩個方法,覆蓋onGlobalLayout()
和請求的hello()
方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.