Java向上向下轉(zhuǎn)型詳解
Java之所以可以向上向下轉(zhuǎn)型是依據(jù)Java三大特性之一的多態(tài)性,而轉(zhuǎn)型就是對(duì)象的多態(tài)性,需要注意的是轉(zhuǎn)型的前提是方法覆寫(xiě)
轉(zhuǎn)型:
[自動(dòng),90%] (1)對(duì)象的向上轉(zhuǎn)型:父類 父類對(duì)象 = 子類實(shí)例
[強(qiáng)制,1%] (2)對(duì)象的向下轉(zhuǎn)型:子類 子類對(duì)象 = (子類) 父類實(shí)例
觀察向上轉(zhuǎn)型
package TestOverride; ? /** ?* Author:weiwei ?* description:向上轉(zhuǎn)型 ?* Creat:2019/3/29 ?**/ ? class Person{ ? ? public void print(){ ? ? ? ? System.out.println("1.我是爸爸!"); ? ? } } class Student extends Person{ ? ? public void print(){ ? ? ? ? System.out.println("2.我是兒子!"); ? ? } } public class Test { ? ? public static void main(String[] args) { ? ? ? ? Person per = new Student();//向上轉(zhuǎn)型 ? ? ? ? per.print(); ? ? } }
運(yùn)行結(jié)果:
2.我是兒子!
Process finished with exit code 0
運(yùn)行結(jié)果只打印了子類print方法的內(nèi)容,因?yàn)橄蛏限D(zhuǎn)型將子類對(duì)象變?yōu)楦割悓?duì)象,調(diào)用了子類的print方法
向下轉(zhuǎn)型指的是將父類對(duì)象變?yōu)樽宇悓?duì)象,但在這之前我們需要明確:為什么我們需要向下轉(zhuǎn)型?當(dāng)你需要子類擴(kuò)
充操作的時(shí)候就要采用向下轉(zhuǎn)型
觀察向下轉(zhuǎn)型(存在安全隱患)
package TestOverride; ? /** ?* Author:weiwei ?* description:向下轉(zhuǎn)型 ?* Creat:2019/3/29 ?**/ ? class Person{ ? ? public void print(){ ? ? ? ? System.out.println("1.我是爸爸!"); ? ? } } class Student extends Person{ ? ? public void print(){ ? ? ? ? System.out.println("2.我是兒子!"); ? ? } ? ? public void fun(){ ? ? ? ? System.out.println("只有兒子有!"); ? ? } } public class Test { ? ? public static void main(String[] args) { ? ? ? ? Person per = new Person(); ? ? ? ? per.print(); ? ? ? ? //這個(gè)時(shí)候父類能夠調(diào)用的方法都是本類定義好的方法 ? ? ? ? //所以并沒(méi)有Student類中的fun()方法,那么只能夠進(jìn)行向下轉(zhuǎn)型處理 ? ? ? ? Student stu = (Student) per; ? ? ? ? stu.fun(); ? ? } }
并不是所有的父類對(duì)象都可以向下轉(zhuǎn)型,如果要想進(jìn)行向下操作之前,一定要首先發(fā)生向上轉(zhuǎn)型,否則在轉(zhuǎn)型時(shí)會(huì)出現(xiàn) ClassCastException 。
觀察錯(cuò)誤轉(zhuǎn)型
Person per = new Person(); //父類對(duì)象 Student stu = (Student) per; //強(qiáng)轉(zhuǎn)
如果向下轉(zhuǎn)型存在安全隱患,那么如何轉(zhuǎn)型才靠譜呢?最好的做法就是先進(jìn)行判斷,而后在進(jìn)行轉(zhuǎn)型,那么就可以依instanceo關(guān)鍵字實(shí)現(xiàn),該關(guān)鍵字語(yǔ)法如下:
子類對(duì)象 instanceof類,返回boolean類型
觀察instanceof操作
Person per = new Student(); ? ? ? ? System.out.println(per instanceof Person); ? ? ? ? System.out.println(per instanceof Student); ? ? ? ? if (per instanceof Student) { //避免ClassCastException ? ? ? ? ? ?Student stu = (Student) per ; ? ? ? ? ? ?stu.fun(); ? ? ? ?}
這種轉(zhuǎn)換到底有什么意義?
要求定義一個(gè)方法,這個(gè)方法可以接收Person類的所有子類實(shí)例,并調(diào)用Person類的方法。
package TestOverride; ? /** ?* Author:weiwei ?* description:向下轉(zhuǎn)型 ?* Creat:2019/3/29 ?**/ ? class Person{ ? ? public void print(){ ? ? ? ? System.out.println("1.我是人類!"); ? ? } } class Student extends Person{ ? ? public void print(){ ? ? ? ? System.out.println("2.我是學(xué)生!"); ? ? } } class Worker extends Person{ ? ? public void print(){ ? ? ? ? System.out.println("3.我是工人!"); ? ? } } public class Test { ? ? public static void main(String[] args) { ? ? ? ? whoAre(new Student()); ? ? ? ? whoAre(new Worker()); ? ? } ? ? public static void whoAre(Person per){ ? ? ? ? per.print(); ? ? } }
通過(guò)以上分析就可以清楚,對(duì)象的向上轉(zhuǎn)型有一個(gè)最為核心的用途:操作參數(shù)統(tǒng)一。
多態(tài)性總結(jié):
- 對(duì)象多態(tài)性的核心在于方法的覆寫(xiě)。
- 通過(guò)對(duì)象的向上轉(zhuǎn)型可以實(shí)現(xiàn)接收參數(shù)的統(tǒng)一,向下轉(zhuǎn)型可以實(shí)現(xiàn)子類擴(kuò)充方法的調(diào)用(一般不操作向下轉(zhuǎn)型,有安全隱患)。
- 兩個(gè)沒(méi)有關(guān)系的類對(duì)象是不能夠進(jìn)行轉(zhuǎn)型的,一定會(huì)產(chǎn)生ClassCastException。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Intellij idea 代碼提示忽略字母大小寫(xiě)和常用快捷鍵及設(shè)置步驟
這篇文章主要介紹了Intellij idea 代碼提示忽略字母大小寫(xiě)和常用快捷鍵及設(shè)置步驟,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-02-02java利用多線程和Socket實(shí)現(xiàn)猜拳游戲
這篇文章主要為大家詳細(xì)介紹了java利用多線程和Socket實(shí)現(xiàn)猜拳游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-08-08SpringBoot 枚舉類型的自動(dòng)轉(zhuǎn)換的實(shí)現(xiàn)
一般我們?cè)跀?shù)據(jù)庫(kù)都會(huì)定義數(shù)值型的枚舉常量,不管是序列化還是反序列化都是需要我們手動(dòng)去轉(zhuǎn)換成枚舉類型的,本文主要介紹了Spring Boot 枚舉類型的自動(dòng)轉(zhuǎn)換,感興趣的可以了解一下2022-03-03使用Spark?SQL實(shí)現(xiàn)讀取不帶表頭的txt文件
這篇文章主要為大家詳細(xì)介紹了如何使用Spark?SQL實(shí)現(xiàn)讀取不帶表頭的txt文件,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-03-03SpringCloud?Gateway詳細(xì)分析實(shí)現(xiàn)負(fù)載均衡與熔斷和限流
這篇文章主要介紹了SpringCloud?Gateway實(shí)現(xiàn)路由轉(zhuǎn)發(fā),負(fù)載均衡,熔斷和限流,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-07-07SpringBoot?AOP?@Pointcut切入點(diǎn)表達(dá)式排除某些類方式
這篇文章主要介紹了SpringBoot?AOP?@Pointcut切入點(diǎn)表達(dá)式排除某些類方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11