亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

抽象方法是怎么實現子類統一的入口的?父類.對象方法;又不能訪問;指向父類方法;方法又是不完整的

抽象方法是怎么實現子類統一的入口的?父類.對象方法;又不能訪問;指向父類方法;方法又是不完整的

www說 2018-12-06 23:02:51
如果我把抽象類的抽象方法注釋掉了;maxArea()里的.area()會報錯;shapes[0] = new Circle(1);完成向上構造;shapes[0].area();向上構造看引用類型;如果點的父類方法;那是不完整的;如果是指向對象的方法;父類又不能訪問子類;那么shapes[0].area();.的到底是誰的?為什么?抽象方法為什么是子類統一的入口?請你幫我解釋下好嗎?public class ShapeTest {public static void main(String[] args) {//Shape s = new Shape(); //編譯錯誤,抽象類不能被實例化Shape[] shapes = new Shape[4]; //創建Shape數組對象shapes[0] = new Circle(1);shapes[1] = new Circle(2); //大shapes[2] = new Square(1);shapes[3] = new Square(2);maxArea(shapes);}//求數組的最大面積public static void maxArea(Shape[] shapes){double max = shapes[0].area();int maxIndex = 0; //最大面積下標for(int i=1;i<shapes.length;i++){double area = shapes[i].area();if(area>max){max=area;maxIndex=i;}}System.out.println("最大面積為:"+max+",所在下標為:"+maxIndex);}}abstract class Shape{ //抽象類protected double c; //周長public abstract double area(); //抽象方法}class Circle extends Shape{public Circle(double c){super.c = c;}public double area(){ //重寫抽象方法return 0.0796*c*c; //0.0625}}class Square extends Shape{public Square(double c){super.c = c;}public double area(){return 0.0625*c*c;}}
查看完整描述

4 回答

?
呼如林

TA貢獻1798條經驗 獲得超3個贊

你父類有的特性派生類肯定有,你子類有的特性父類不一定有。

因此你把父類的特性(方法)去掉,而你申明的又是父類的數組,編譯器當然不知道你會塞個什么東西進去,所以會報錯咯。

父類不能訪問子類這個也正常,你子類可能有自己的特殊性,那么我父類去訪問的時候怎么知道這些東西呢?而且在對象構造時子類的構造函數在執行時第一步就是去super父類,那么也就說明了現有父類后有子類,如果能夠讓父類去訪問子類的信息這個就會出現問題(這個時候子類還沒完成構造工作)。

shapes[0].area()這個具體是誰的area方法要看你shapes[0]里面是誰了,如果是Circle而且它又override掉了父類的這個方法那就是Circle的了,如果沒有override那么就是父類的了。這個解釋也很簡單,主要是看shapes[0]在運行時是誰,這是面相對象語言本來的特性。

抽象方法是子類的統一入口這個描述不太準確,一個是方法,一個是對象實例,這兩個沒關系。抽象方法需要在其派生類中去實現,而抽象方法本身僅作為一種契約而已,這個不是這個方法的唯一入口,如果你直接Circle c=new Circle()后還是可以執行這個方法(這個被override方法本來就屬于Circle對象)

查看完整回答
反對 回復 2018-12-16
?
呼啦一陣風

TA貢獻1802條經驗 獲得超6個贊

怎么判斷:如果是Circle而且它又override掉了父類的這個方法那就是Circle的了;是引用嗎?

查看完整回答
反對 回復 2018-12-16
?
素胚勾勒不出你

TA貢獻1827條經驗 獲得超9個贊

@小梁丶:?

針對這個場景吧。

Shape shape=new Circle();

shape.area();

這個在實際調用的時候area方法是個虛方法,那么需要根據對象派生關系找到實際調用方法的來源,由于你Circle已經override掉了此方法,而且此處實例化的實例是Circle,那么當然就調用Circle的方法了。

查看完整回答
反對 回復 2018-12-16
  • 4 回答
  • 0 關注
  • 602 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號