Java 向上轉(zhuǎn)型和向下轉(zhuǎn)型的詳解
?Java 向上轉(zhuǎn)型和向下轉(zhuǎn)型的詳解
轉(zhuǎn)型是在繼承的基礎(chǔ)上而言的,繼承是面向?qū)ο笳Z(yǔ)言中,代碼復(fù)用的一種機(jī)制,通過(guò)繼承,子類(lèi)可以復(fù)用父類(lèi)的功能,如果父類(lèi)不能滿足當(dāng)前子類(lèi)的需求,則子類(lèi)可以重寫(xiě)父類(lèi)中的方法來(lái)加以擴(kuò)展。
向上轉(zhuǎn)型:子類(lèi)引用的對(duì)象轉(zhuǎn)換為父類(lèi)類(lèi)型稱(chēng)為向上轉(zhuǎn)型。通俗地說(shuō)就是是將子類(lèi)對(duì)象轉(zhuǎn)為父類(lèi)對(duì)象。此處父類(lèi)對(duì)象可以是接口
向下轉(zhuǎn)型:父類(lèi)引用的對(duì)象轉(zhuǎn)換為子類(lèi)類(lèi)型稱(chēng)為向下轉(zhuǎn)型。
前者是一個(gè)向上轉(zhuǎn)型,Animal dog 引用指向new Dog();子類(lèi)對(duì)象當(dāng)成父類(lèi)對(duì)象,只能調(diào)用父類(lèi)的成員,如果子類(lèi)重寫(xiě)了父類(lèi)的方法就根據(jù)這個(gè)引用指向調(diào)用子類(lèi)重寫(xiě)的這個(gè)方法(這個(gè)方法就是覆蓋override)。這個(gè)調(diào)用過(guò)程就稱(chēng)為“動(dòng)態(tài)綁定”。
轉(zhuǎn)型需要注意的問(wèn)題:
向上轉(zhuǎn)型時(shí),父類(lèi)指向子類(lèi)引用對(duì)象會(huì)遺失除與父類(lèi)對(duì)象共有的其他方法,也就是在轉(zhuǎn)型過(guò)程中,子類(lèi)的新有的方法都會(huì)遺失掉,在編譯時(shí),系統(tǒng)會(huì)提供找不到方法的錯(cuò)誤。
實(shí)例如下:
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中沒(méi)有定義fly方法。
}
在向下轉(zhuǎn)型過(guò)程中,分為兩種情況:
情況一:如果父類(lèi)引用的對(duì)象如果引用的是指向的子類(lèi)對(duì)象,那么在向下轉(zhuǎn)型的過(guò)程中是安全的。也就是編譯是不會(huì)出錯(cuò)誤的。
情況二:如果父類(lèi)引用的對(duì)象是父類(lèi)本身,那么在向下轉(zhuǎn)型的過(guò)程中是不安全的,編譯不會(huì)出錯(cuò),但是運(yùn)行時(shí)會(huì)出現(xiàn)java.lang.ClassCastException錯(cuò)誤。它可以使用instanceof來(lái)避免出錯(cuò)此類(lèi)錯(cuò)誤。
實(shí)例如下:
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)型,編譯和運(yùn)行皆不會(huì)出錯(cuò)
mmg.smile();
mmg.c();
Girl g2=new Girl();
//MMGirl mmg1=(MMGirl)g2; //不安全的向下轉(zhuǎn)型,編譯無(wú)錯(cuò)但會(huì)運(yùn)行會(huì)出錯(cuò)
//mmg1.smile();
//mmg1.c();
if(g2 instanceof MMGirl){
MMGirl mmg1=(MMGirl)g2;
mmg1.smile();
mmg1.c();
}
}
總結(jié):
1、父類(lèi)引用可以指向子類(lèi)對(duì)象,子類(lèi)引用不能指向父類(lèi)對(duì)象。
2、把子類(lèi)對(duì)象直接賦給父類(lèi)引用叫upcasting向上轉(zhuǎn)型,向上轉(zhuǎn)型不用強(qiáng)制轉(zhuǎn)型。
如Father father = new Son();
3、把指向子類(lèi)對(duì)象的父類(lèi)引用賦給子類(lèi)引用叫向下轉(zhuǎn)型(downcasting),要強(qiáng)制轉(zhuǎn)型。
如father就是一個(gè)指向子類(lèi)對(duì)象的父類(lèi)引用,把father賦給子類(lèi)引用son 即Son son =(Son)father;
其中father前面的(Son)必須添加,進(jìn)行強(qiáng)制轉(zhuǎn)換。
4、upcasting 會(huì)丟失子類(lèi)特有的方法,但是子類(lèi)overriding 父類(lèi)的方法,子類(lèi)方法有效
5、向上轉(zhuǎn)型的作用,減少重復(fù)代碼,父類(lèi)為參數(shù),調(diào)有時(shí)用子類(lèi)作為參數(shù),就是利用了向上轉(zhuǎn)型。這樣使代碼變得簡(jiǎn)潔。體現(xiàn)了JAVA的抽象編程思想。
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
相關(guān)文章
遠(yuǎn)程連接Jedis和整合SpringBoot的詳細(xì)過(guò)程
這篇文章主要介紹了遠(yuǎn)程連接Jedis和整合SpringBoot的詳細(xì)過(guò)程,本文通過(guò)圖文實(shí)例相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-08-08
SpringBoot項(xiàng)目為何引入大量的starter?如何自定義starter?
這篇文章主要介紹了SpringBoot項(xiàng)目為何引入大量的starter?如何自定義starter?文章基于這兩個(gè)問(wèn)題展開(kāi)全文,需要的小伙伴可以參考一下2022-04-04
javaweb實(shí)戰(zhàn)之商城項(xiàng)目開(kāi)發(fā)(一)
這篇文章主要針對(duì)javaweb商城項(xiàng)目開(kāi)發(fā)進(jìn)行實(shí)戰(zhàn)演習(xí),對(duì)javaweb商城項(xiàng)目開(kāi)發(fā)進(jìn)行詳細(xì)分析,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-02-02
Java實(shí)現(xiàn)將數(shù)字日期翻譯成英文單詞的工具類(lèi)實(shí)例
這篇文章主要介紹了Java實(shí)現(xiàn)將數(shù)字日期翻譯成英文單詞的工具類(lèi),結(jié)合完整實(shí)例形式分析了Java日期轉(zhuǎn)換與字符串操作相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-09-09
SpringBoot讀取自定義配置文件方式(properties,yaml)
這篇文章主要介紹了SpringBoot讀取自定義配置文件方式(properties,yaml),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07
如何解決IDEA中JSP頁(yè)面部分出現(xiàn)綠色背景色問(wèn)題
這篇文章主要介紹了如何解決IDEA中JSP頁(yè)面部分出現(xiàn)綠色背景色問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12
Java實(shí)現(xiàn)簡(jiǎn)單的遞歸操作方法實(shí)例
這篇文章主要給大家介紹了關(guān)于Java實(shí)現(xiàn)簡(jiǎn)單的遞歸操作的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02

