Java 向上轉(zhuǎn)型和向下轉(zhuǎn)型的詳解
?Java 向上轉(zhuǎn)型和向下轉(zhuǎn)型的詳解
轉(zhuǎn)型是在繼承的基礎(chǔ)上而言的,繼承是面向?qū)ο笳Z言中,代碼復(fù)用的一種機制,通過繼承,子類可以復(fù)用父類的功能,如果父類不能滿足當(dāng)前子類的需求,則子類可以重寫父類中的方法來加以擴展。
向上轉(zhuǎn)型:子類引用的對象轉(zhuǎn)換為父類類型稱為向上轉(zhuǎn)型。通俗地說就是是將子類對象轉(zhuǎn)為父類對象。此處父類對象可以是接口
向下轉(zhuǎn)型:父類引用的對象轉(zhuǎn)換為子類類型稱為向下轉(zhuǎn)型。
前者是一個向上轉(zhuǎn)型,Animal dog 引用指向new Dog();子類對象當(dāng)成父類對象,只能調(diào)用父類的成員,如果子類重寫了父類的方法就根據(jù)這個引用指向調(diào)用子類重寫的這個方法(這個方法就是覆蓋override)。這個調(diào)用過程就稱為“動態(tài)綁定”。
轉(zhuǎn)型需要注意的問題:
向上轉(zhuǎn)型時,父類指向子類引用對象會遺失除與父類對象共有的其他方法,也就是在轉(zhuǎn)型過程中,子類的新有的方法都會遺失掉,在編譯時,系統(tǒng)會提供找不到方法的錯誤。
實例如下:
public class Animal { public void eat(){ System.out.println("animal eatting..."); } } class Bird extends Animal{ public void eat(){ System.out.println("bird eatting..."); } public void fly(){ System.out.println("bird flying..."); } } class Main{ public static void main(String[] args) { Animal b=new Bird(); //向上轉(zhuǎn)型 b.eat(); b.fly(); //此處提示在Animal中沒有定義fly方法。 }
在向下轉(zhuǎn)型過程中,分為兩種情況:
情況一:如果父類引用的對象如果引用的是指向的子類對象,那么在向下轉(zhuǎn)型的過程中是安全的。也就是編譯是不會出錯誤的。
情況二:如果父類引用的對象是父類本身,那么在向下轉(zhuǎn)型的過程中是不安全的,編譯不會出錯,但是運行時會出現(xiàn)java.lang.ClassCastException錯誤。它可以使用instanceof來避免出錯此類錯誤。
實例如下:
public class Girl { public void smile(){ System.out.println("girl smile()..."); } } class MMGirl extends Girl{ @Override public void smile() { System.out.println("MMirl smile sounds sweet..."); } public void c(){ System.out.println("MMirl c()..."); } } class main{ public static void main(String[] args) { Girl g1=new MMGirl(); //向上轉(zhuǎn)型 g1.smile(); MMGirl mmg=(MMGirl)g1; //向下轉(zhuǎn)型,編譯和運行皆不會出錯 mmg.smile(); mmg.c(); Girl g2=new Girl(); //MMGirl mmg1=(MMGirl)g2; //不安全的向下轉(zhuǎn)型,編譯無錯但會運行會出錯 //mmg1.smile(); //mmg1.c(); if(g2 instanceof MMGirl){ MMGirl mmg1=(MMGirl)g2; mmg1.smile(); mmg1.c(); } }
總結(jié):
1、父類引用可以指向子類對象,子類引用不能指向父類對象。
2、把子類對象直接賦給父類引用叫upcasting向上轉(zhuǎn)型,向上轉(zhuǎn)型不用強制轉(zhuǎn)型。
如Father father = new Son();
3、把指向子類對象的父類引用賦給子類引用叫向下轉(zhuǎn)型(downcasting),要強制轉(zhuǎn)型。
如father就是一個指向子類對象的父類引用,把father賦給子類引用son 即Son son =(Son)father;
其中father前面的(Son)必須添加,進行強制轉(zhuǎn)換。
4、upcasting 會丟失子類特有的方法,但是子類overriding 父類的方法,子類方法有效
5、向上轉(zhuǎn)型的作用,減少重復(fù)代碼,父類為參數(shù),調(diào)有時用子類作為參數(shù),就是利用了向上轉(zhuǎn)型。這樣使代碼變得簡潔。體現(xiàn)了JAVA的抽象編程思想。
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
相關(guān)文章
為什么說要慎用SpringBoot @ComponentScan
本文主要介紹了為什么說要慎用SpringBoot @ComponentScan,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-07-07feign遠(yuǎn)程調(diào)用無法傳遞對象屬性405的問題
這篇文章主要介紹了feign遠(yuǎn)程調(diào)用無法傳遞對象屬性405的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03mybatis實現(xiàn)遍歷Map的key和value
這篇文章主要介紹了mybatis實現(xiàn)遍歷Map的key和value方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-01-01Spring?Boot?實現(xiàn)字段唯一校驗功能(實例代碼)
這篇文章主要介紹了Spring?Boot?實現(xiàn)字段唯一校驗,實現(xiàn)代碼很簡單,代碼簡單易懂,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-08-08