日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

父类引用指向子类对象是什么意思

發(fā)布時(shí)間:2023/12/20 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 父类引用指向子类对象是什么意思 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

  在java的多態(tài)中,經(jīng)常會(huì)看到父類(lèi)的引用對(duì)象指向子類(lèi)的對(duì)象,一開(kāi)始很迷茫,因?yàn)榘凑罩八鶎W(xué)的知識(shí),父類(lèi)的引用對(duì)象指向自身對(duì)象或者子類(lèi)的引用對(duì)象指向自身對(duì)象都不難理解,因此為了方便理解,下面舉了一個(gè)例子:水杯和水壺的比喻。

? ? ? ?

?

  下面的一段代碼來(lái)實(shí)現(xiàn)這個(gè)比喻:

1 public class Kettle {2 public Kettle(){3 System.out.println("水壺容量有2升");4 }5 }6 7 public class Cup extends Kettle {8 public Cup(){9 System.out.println("水杯容量為0.5升"); 10 } 11 } 12 13 public class Test { 14 public static void main(String[] args) { 15 Kettle k = new Kettle(); //父類(lèi)的引用對(duì)象指向自身:把2升水倒入到水壺中,不會(huì)溢出 16 Cup c = new Cup();//子類(lèi)的引用對(duì)象指向自身:把0.5升的水倒入到水杯中,不會(huì)溢出 17 Kettle k1 = new Cup(); //父類(lèi)的引用對(duì)象指向子類(lèi):把0.5升的水倒入到水壺中,不會(huì)溢出 18 Kettle k2 = (Kettle)c; //父類(lèi)的引用對(duì)象指向子類(lèi)中繼承父類(lèi)的那一部分對(duì)象:把水杯中的0.5升水倒入到水壺中,不會(huì)溢出 19 Cup c2 = (Cup)k; //子類(lèi)的引用對(duì)象指向父類(lèi)對(duì)象,報(bào)錯(cuò),不能轉(zhuǎn)換類(lèi)型:水壺里面的水不能倒入到水杯中,會(huì)溢出 20 Cup c3 = (Cup)k2;//相當(dāng)于Cup c3 = (Cup)(Kettle)c,子類(lèi)的引用對(duì)象指向子類(lèi)中繼承父類(lèi)的那一部分對(duì)象:把水壺中0.5升的水倒入到水杯中,不會(huì)溢出 21 } 22 }

?

上面的代碼運(yùn)行結(jié)果如下:

1 水壺容量有2升 2 水壺容量有2升 3 水杯容量為0.5升 4 水壺容量有2升 5 水杯容量為0.5升 6 Exception in thread "main" java.lang.ClassCastException: mycom.Kettle cannot be cast to mycom.Cup 7 at mycom.Test.main(Test.java:9)

其中報(bào)錯(cuò)的哪一行就是Cup c2 = (Cup)k,由于無(wú)法轉(zhuǎn)換類(lèi)型。

  下面來(lái)改寫(xiě)一下代碼:方法的引用操作

1 public class Kettle {2 public void holeWater(){3 System.out.println("水壺有裝水的功能");4 }5 }6 7 public class Cup extends Kettle {8 public void holeWater(){9 System.out.println("水杯也有裝水的功能"); 10 } 11 public void drinkWater(){ 12 System.out.println("水杯可以拿來(lái)喝水的功能"); 13 } 14 } 15 16 17 public class Test { 18 public static void main(String[] args) { 19 Kettle k = new Cup(); //父類(lèi)的引用對(duì)象指向子類(lèi) 20 k.holeWater(); 21 k.darinkWater(); //報(bào)錯(cuò) 22 } 23 }

  首先,要實(shí)現(xiàn)多態(tài),必須有三個(gè)條件:父類(lèi)引用、子類(lèi)對(duì)象、方法覆蓋,在上面的程序中,k調(diào)用holeWater方法可以正常編譯,因?yàn)闈M(mǎn)足三個(gè)條件,而后面的drinkWater方法由于在父類(lèi)中沒(méi)有,因此在調(diào)用時(shí),會(huì)報(bào)錯(cuò),沒(méi)有滿(mǎn)足“方法覆蓋"的條件,多態(tài)實(shí)際上是一種機(jī)制,在編譯時(shí)刻,會(huì)生成一張?zhí)摂M表,來(lái)記錄所有覆蓋的方法,沒(méi)有被覆蓋的方法是不會(huì)記錄到這張表的.若一個(gè)父類(lèi)引用調(diào)用了沒(méi)有覆蓋的子類(lèi)方法,那么是不符合該表的,那么編譯時(shí)刻就會(huì)報(bào)錯(cuò).?在執(zhí)行程序的時(shí)候,虛擬機(jī)會(huì)去這張?zhí)摂M表中找覆蓋的方法,比如引用中實(shí)際上存的是一個(gè)子類(lèi)對(duì)象引用,那么就會(huì)去找子類(lèi)中的相應(yīng)的覆蓋的方法來(lái)執(zhí)行。

  綜上所述,用父類(lèi)的引用對(duì)象指向子類(lèi)對(duì)象,可以隱藏各個(gè)對(duì)象不同的細(xì)節(jié),專(zhuān)注于共同的屬性,這就是面向?qū)ο蟮乃枷搿?/p>

總結(jié)

以上是生活随笔為你收集整理的父类引用指向子类对象是什么意思的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。