[英]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){...}
}
method()
? 考慮以下代碼
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時,發生編譯錯誤。 據我了解,編譯器不會自動強制轉換,不是嗎?
不,編譯器不會自動強制轉換。 沒有從Object
到Number
隱式轉換,因此您不能使用Number
類型的參數和Object
類型的參數來調用方法。
在這種情況下,當我們轉換為Number時,編譯器在做什么?
驗證someObj
值為null或對Number
實例或子類的引用。
直到JDK7:
因為靜態方法綁定到該類。 您通常按如下方式調用它們:
MyClass.method("");
您無法覆蓋它們。
參見1,所有接口方法都是public abstract
您不能更改!
否編譯器不會自動強制轉換
他試圖拋投失敗
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.