簡體   English   中英

實現接口方法,方法調用和類型轉換

[英]Implements method of interface, method call and type cast

考慮以下代碼

interface MyInterface{
    void method(String s);// if we write static modifier we have compile error
}
class MyClass implements MyInterface{
    public static void main(String[] args){
        myMethod(new Object());//Compile error
    }
    static void method(String s){...}// compile error
    static void myMethod(Number n){...}

}
  1. 為什么我們不能在接口中定義靜態方法?
  2. 為什么我們不能用靜態修飾符實現method()
  3. 當我們參考對象調用myMethod時,發生編譯錯誤。 據我了解,編譯器不會自動強制轉換,不是嗎?
  4. 考慮以下代碼

    Object someObj; ... Number n= (Number) someObj;

在這種情況下,當我們轉換為Number時,編譯器在做什么?

為什么我們不能在接口中定義靜態方法?

接口的所有方法默認情況下都是public abstract 使用static修飾符沒有意義。 因為靜態方法的調用不是多態的。 從某種意義上說,您不能覆蓋它們。 您只能在類名稱上調用靜態方法。 好了,您也可以在某些引用上調用它們,但是最終將根據聲明的引用類型來解決。 現在,由於默認情況下該方法是抽象的,因此調用它沒有任何意義。 它沒有任何機構可以執行任何任務。

為什么我們不能用靜態修飾符實現method()?

當您嘗試將static修飾符添加到重寫的方法時,不認為它是重寫的。 因此,您的類實際上具有兩種不同的方法,它們具有相同的名稱,相同的參數和相同的返回類型。 當然,這是不允許在班級內部進行的。

請注意,您必須在類的重寫方法中顯式添加public修飾符,否則您的代碼將無法編譯。 原因是,您不能降低子類中重寫方法的可見性。

當我們參考對象調用myMethod時,發生編譯錯誤。 據我了解,編譯器不會自動強制轉換,不是嗎?

Jave不會自動縮小轉換范圍。 您需要顯式添加演員表。 但是,即使允許,您仍希望代碼表現如何,因為您嘗試使用子類引用來引用超類對象? 您當然可以通過在調用方法時添加強制類型轉換來使代碼進行編譯:

myMethod((Number)new Object());  // This will compile, but fail at runtime

上面的調用將在運行時導致ClassCastException

但是,如果您有一個Object引用引用Number的任何子類的對象,則可以添加一個顯式的強制類型轉換,該類型將是安全的:

Object obj = new Integer(5);
Number num = (Number)obj;  // This is fine. Because `obj` is referring to an `Integer`.

最后,您的main方法的簽名不正確。 您缺少public修飾符。

為什么我們不能在接口中定義靜態方法?

基本上,接口旨在與多態一起使用。 多態性當在接口上調用靜態方法時,如何知道要調用哪個實現?

// Should that invoke MyClass.method or MyOtherImplementation.method?
MyInterface.method("foo");

下一個:

為什么我們不能用靜態修飾符實現method()?

這個想法是在實現接口的某些對象上調用該方法-這使其成為實例方法。

當我們參考對象調用myMethod時,發生編譯錯誤。 據我了解,編譯器不會自動強制轉換,不是嗎?

不,編譯器不會自動強制轉換。 沒有從ObjectNumber隱式轉換,因此您不能使用Number類型的參數和Object類型的參數來調用方法。

在這種情況下,當我們轉換為Number時,編譯器在做什么?

驗證someObj值為null或對Number實例或子類的引用。

直到JDK7:

  1. 因為靜態方法綁定到該類。 您通常按如下方式調用它們:

     MyClass.method(""); 

    您無法覆蓋它們。

  2. 參見1,所有接口方法都是public abstract您不能更改!

  3. 否編譯器不會自動強制轉換

  4. 他試圖拋投失敗

暫無
暫無

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

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