簡體   English   中英

覆蓋方法,為什么我不能引用新的自己的方法?

[英]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 ,因為該表達式的類型您的新匿名類型。

可以不hellolistener因為編譯時類型listenerOnGlobalLayoutListener ,其中沒有一個hello方法。

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

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

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

在這兩種情況下,您都可以通過創建匿名內部類來實例化對象,但引用hello()方法的方式有所不同:

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

在第二種情況下,可以訪問hello()方法,因為您在剛剛實例化的類的引用上調用它。 與接口相比,該類有兩個方法,覆蓋onGlobalLayout()和請求的hello()方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM