4 回答

TA貢獻1798條經驗 獲得超3個贊
你父類有的特性派生類肯定有,你子類有的特性父類不一定有。
因此你把父類的特性(方法)去掉,而你申明的又是父類的數組,編譯器當然不知道你會塞個什么東西進去,所以會報錯咯。
父類不能訪問子類這個也正常,你子類可能有自己的特殊性,那么我父類去訪問的時候怎么知道這些東西呢?而且在對象構造時子類的構造函數在執行時第一步就是去super父類,那么也就說明了現有父類后有子類,如果能夠讓父類去訪問子類的信息這個就會出現問題(這個時候子類還沒完成構造工作)。
shapes[0].area()這個具體是誰的area方法要看你shapes[0]里面是誰了,如果是Circle而且它又override掉了父類的這個方法那就是Circle的了,如果沒有override那么就是父類的了。這個解釋也很簡單,主要是看shapes[0]在運行時是誰,這是面相對象語言本來的特性。
抽象方法是子類的統一入口這個描述不太準確,一個是方法,一個是對象實例,這兩個沒關系。抽象方法需要在其派生類中去實現,而抽象方法本身僅作為一種契約而已,這個不是這個方法的唯一入口,如果你直接Circle c=new Circle()后還是可以執行這個方法(這個被override方法本來就屬于Circle對象)

TA貢獻1827條經驗 獲得超9個贊
@小梁丶:?
針對這個場景吧。
Shape shape=new Circle();
shape.area();
這個在實際調用的時候area方法是個虛方法,那么需要根據對象派生關系找到實際調用方法的來源,由于你Circle已經override掉了此方法,而且此處實例化的實例是Circle,那么當然就調用Circle的方法了。
添加回答
舉報