2015-10-16 126 views
1

假設我有一個叫做A的類。我有另一個課程,調用BJava:類和擴展類

B包含一個名爲BsMethod()的方法,即A不包含。

說我申報A數組:arrA = new A[10]

我分配arrA[1] = new B();

我嘗試做arrA[1].BsMethod()

這給出了一個錯誤,說arrA不包含此方法來調用BsMethod 。我應該更改什麼,以便我可以使用arrA[1]致電BsMethod

回答

2

這是失敗的,因爲在編譯java編譯器無法綁定該方法與class A對象,它不能找到方法BsMethod()class A

您可以將對象投射到class B並使用它。

((B)arrA[1]).BsMethod(); 

動態綁定實際方法調用在運行時間被確定。所以如果你有一個超類的方法,你也可以在子類中覆蓋它。然後,在運行時確定實際的方法調用,這種方法。

您可以通過示例閱讀更多關於靜態和動態綁定的信息。 Static Binding and Dynamic Binding

+0

這不是真的準確;綁定仍然是動態的,並且JVM仍然會在運行時確定實際調用哪個方法(因爲它可能被覆蓋)。靜態綁定僅在不可覆蓋時纔會發生,這意味着靜態,最終或私有方法。但是(無需強制轉換)'arrA [1]'的編譯時類型是'A',所以編譯器無法綁定在'B'中聲明的方法。 –

+0

@JoeriHendrickx我希望現在有道理。 – YoungHobbit

1

你要投arrA[1]作爲B因爲arrAA的陣列和編譯器不知道在這一點上約B

這樣稱呼:((B)arrA[1]).BsMethod()