簡體   English   中英

為什么對象類方法在接口中可用?

[英]Why Object class methods are available in interface?

以下接口和類已成功編譯。 在下面的輸出中提到了問題:

interface MyInterface{}

class MyClass implements MyInterface{}

class InterDoubt{

    static MyInterface mi ;//= new MyClass() ;

    public static void main(String[] args){
        System.out.println("X") ;

        try{
            synchronized(mi){
                try{
                    mi.wait(4000) ;
                }
                catch(InterruptedException ie){
                    System.out.println("Exception occured at main.") ;
                }
            }
        }
        catch(Exception e){
            System.out.println("voilla, MyInterface is an interface,\n" + 
                       "then why compiler allows compilation of\n" +
                       "mi.getClass(), mi.wait().\n" +
                       "Or how the methods of Object class are available in an interface."
            );
        }

        System.out.println("Y") ;
    }
}

輸出:

X

瞧,MyInterface是一個接口,

那為什么編譯器允許編譯

mi.getClass(),mi.wait()。

或接口中如何使用Object類的方法。

ÿ


編輯 :-我接受拒絕的答案,因為這是最具解釋性的。 但是在閱讀了答案之后,又出現了一個問題:-

請記住,如果接口試圖在Object類中聲明一個聲明為'final'的公共實例方法,則將導致編譯時錯誤。例如,'public final Class getClass()'是一個聲明為'最終”在Object類中,因此,如果接口嘗試使用此簽名聲明方法,則編譯將失敗 (引自解釋)。

那么為什么下面的代碼被成功編譯:-

interface MyInter{
    public void method() ;
}

class MyClass implements MyInter{

    public final void method() {
        .......
        .......
              .......
    }

}

Java語言規范中指定了您正確指出的異常。 接口將自動從添加的類java.lang.Object中獲取所有成員。 這里

Java語言規范明確指出,接口的成員是在接口中聲明的成員和從直接超級接口繼承的成員。 如果接口沒有直接的超接口,則該接口會隱式聲明一個與Object類中聲明的每個公共實例方法相對應的公共抽象成員方法,除非具有相同簽名,相同返回類型和兼容throws子句的方法由以下方法顯式聲明:該界面。 這就是使Object方法的簽名可供編譯器使用的原因,並且代碼編譯時沒有任何錯誤。 請記住,如果接口嘗試在Object類中聲明一個聲明為'final'的公共實例方法,則它將導致編譯時錯誤。 例如,“ public final Class getClass()”是在Object類中聲明為“ final”的公共實例方法,因此,如果接口嘗試聲明具有此簽名的方法,則編譯將失敗。

在運行時,參考mi后面應該有一個真實的對象(或null)。 實型將實現此接口,因此編譯器允許它。 在運行時,可以實現該接口的任何類型。

是的,除原始值外,所有Object的方法均適用於所有方法。 接口對象仍然是對象,因此具有對象的方法。

強制轉換(Object)mi將始終成功,那么為什么需要您提供它?

Java語言規范明確指出,接口的成員是在接口中聲明的成員和從直接超級接口繼承的成員。 如果接口沒有直接的超接口,則該接口會隱式聲明一個與Object類中聲明的每個公共實例方法相對應的公共抽象成員方法,除非具有相同簽名,相同返回類型和兼容throws子句的方法由以下方法顯式聲明:該界面。

暫無
暫無

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

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