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