我有這個(gè)練習(xí):public class TestClass{ public static void main(String args[]){ A[] a, a1; B[] b; a = new A[10]; a1 = a; b = new B[20]; a = b; // 1 b = (B[]) a; // 2 b = (B[]) a1; // 3 } } class A { } class B extends A { } 在我看來(lái),當(dāng)我寫(xiě):a=b 時(shí),我正在為 b 中的對(duì)象分配另一個(gè)引用 (a)。實(shí)際上,b 中的對(duì)象有兩個(gè)引用(a 和 b)。但是,對(duì)于繼承規(guī)則,子類(lèi)也是父類(lèi)類(lèi)型,但父類(lèi)不是子類(lèi)類(lèi)型。如何將超類(lèi)引用 (a) 分配給子類(lèi)類(lèi)型 (b)?這也適用于后續(xù)分配。在我看來(lái),如果我這樣寫(xiě):b=a,代碼將毫無(wú)問(wèn)題地編譯,但是對(duì)于賦值 a=b,應(yīng)該會(huì)出現(xiàn)編譯錯(cuò)誤。為什么這個(gè)分配是正確的?
1 回答

翻過(guò)高山走不出你
TA貢獻(xiàn)1875條經(jīng)驗(yàn) 獲得超3個(gè)贊
假設(shè) A 類(lèi)是 Animal 類(lèi),B 類(lèi)是 Dog 類(lèi)。您可以創(chuàng)建一種動(dòng)物,即狗 (a = b),因?yàn)楣肥莿?dòng)物(子類(lèi))。但這并不適用于相反的方式 (b = a),因?yàn)閯?dòng)物可以不僅僅是狗,例如貓,所以你不能將貓指定為狗。因此,要做到這一點(diǎn),您必須明確地將 Animal 轉(zhuǎn)換為 Dog (b = (Dog) a)。
添加回答
舉報(bào)
0/150
提交
取消