假設我有一個叫做A
的類。我有另一個課程,調用B
。Java:類和擴展類
B
包含一個名爲BsMethod()
的方法,即A
不包含。
說我申報A
數組:arrA = new A[10]
我分配arrA[1] = new B();
我嘗試做arrA[1].BsMethod()
這給出了一個錯誤,說arrA
不包含此方法來調用BsMethod
。我應該更改什麼,以便我可以使用arrA[1]
致電BsMethod
?
假設我有一個叫做A
的類。我有另一個課程,調用B
。Java:類和擴展類
B
包含一個名爲BsMethod()
的方法,即A
不包含。
說我申報A
數組:arrA = new A[10]
我分配arrA[1] = new B();
我嘗試做arrA[1].BsMethod()
這給出了一個錯誤,說arrA
不包含此方法來調用BsMethod
。我應該更改什麼,以便我可以使用arrA[1]
致電BsMethod
?
這是失敗的,因爲在編譯java編譯器無法綁定該方法與class A
對象,它不能找到方法BsMethod()
在class A
。
您可以將對象投射到class B
並使用它。
((B)arrA[1]).BsMethod();
在動態綁定實際方法調用在運行時間被確定。所以如果你有一個超類的方法,你也可以在子類中覆蓋它。然後,在運行時確定實際的方法調用,這種方法。
您可以通過示例閱讀更多關於靜態和動態綁定的信息。 Static Binding and Dynamic Binding
你要投arrA[1]
作爲B
因爲arrA
是A
的陣列和編譯器不知道在這一點上約B
。
這樣稱呼:((B)arrA[1]).BsMethod()
這不是真的準確;綁定仍然是動態的,並且JVM仍然會在運行時確定實際調用哪個方法(因爲它可能被覆蓋)。靜態綁定僅在不可覆蓋時纔會發生,這意味着靜態,最終或私有方法。但是(無需強制轉換)'arrA [1]'的編譯時類型是'A',所以編譯器無法綁定在'B'中聲明的方法。 –
@JoeriHendrickx我希望現在有道理。 – YoungHobbit