父类引用指向子类对象是什么意思
在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)題。
- 上一篇: Windows XP 任务计划每1分钟运
- 下一篇: 2021 Summary