Java 多態(tài)中繼承的轉(zhuǎn)型詳解與用法分析
一、前言
前面我們學(xué)習(xí)了多態(tài)的概述和使用,現(xiàn)在我們來學(xué)習(xí)前面剩下的轉(zhuǎn)型問題。
二、轉(zhuǎn)型
🗡 向上轉(zhuǎn)型
🗡向下轉(zhuǎn)型
為什么會有轉(zhuǎn)型呢,前面我們也說到了,多態(tài)中的使用前提是有父類引用指向子類對象
還有多態(tài)的缺點(diǎn)就是不能訪問子類對象。(可以用到向下轉(zhuǎn)型訪問)
向上轉(zhuǎn)型
🗡其實(shí)多態(tài)中的父類引用指向子類對象就是向下轉(zhuǎn)型,向下轉(zhuǎn)型就是子到父。
就是將子類所申請的空間賦值給父類。形式: fu f=new zi();
向下轉(zhuǎn)型
🗡向下轉(zhuǎn)型的出現(xiàn)就是為了解決多態(tài)中無法訪問子類成員的問題,其實(shí)向下轉(zhuǎn)型本質(zhì)上
就是強(qiáng)轉(zhuǎn),由父到子,父類對象轉(zhuǎn)化為子類對象。形式:zi z= (zi)f ;
我們看個(gè)例子:
在fu類中
public class Fu {
public void show(){
System.out.println("fu:1024程序員節(jié)");
}
public void play(){
System.out.println("fu:1024不見不散");
}
}
zi類中
public class Zi extends Fu {
@Override
public void show() {//重寫fu類中的show方法
super.show();
System.out.println("zi:1024來了呀");
}
public void game(){
System.out.println("zi:寫篇博客提提神");
}
public void juan(){
System.out.println("zi:全員卷王");
}
}
新建一個(gè)測試類
public class FuZiDemo {
public static void main(String[] args) {
Fu f=new Zi();//向上轉(zhuǎn)型
Zi z=(Zi)f;//向下轉(zhuǎn)型
z.show();
z.game();
z.juan();
z.play();
}
}
通過向上和向下轉(zhuǎn)型,此時(shí)我們可以訪問子類父類全部成員

🗡 其實(shí)雖然直接創(chuàng)建子類對象是非常方便的,但是我們多態(tài)的實(shí)現(xiàn)條件之一就是有
父類引用指向子類對象(接口的多態(tài)暫時(shí)不考慮)
public class FuZiDemo {
public static void main(String[] args) {
Zi z=new Zi();//通過子類直接創(chuàng)建對象
z.show();
z.game();
z.juan();
z.play();
}
}
🗡由上述結(jié)果可知,子類對象向上轉(zhuǎn)型為父類對象是不需要顯示轉(zhuǎn)換,而父類對象轉(zhuǎn)化
為子類對象時(shí),需要顯示強(qiáng)制類型轉(zhuǎn)化。
友情提示:向下轉(zhuǎn)型還有幾點(diǎn)需要注意的地方:
🗡①必須保證父類對象是子類的一個(gè)實(shí)例,否則程序報(bào)錯(cuò)。
🗡②向下轉(zhuǎn)型的對象可以訪問父類中的成員和方法,也可以訪問子類中的成員和方法。
public class Demo11 {
public static void main(String[] args) {
Animal a=new Dog();
Dog g=(Dog)a;
Cat c=(Cat)a;//??能否成功
}
}
🗡上述代碼中,父類對象a引用的是子類Dog對象,而不是Cat類對象,可以將a強(qiáng)
制轉(zhuǎn)化為Dog類型,不能a強(qiáng)制轉(zhuǎn)化為Cat類型,因?yàn)橄蛳罗D(zhuǎn)型必須確保父類對象是
子類的一個(gè)實(shí)例所以這個(gè)程序不能成功,且在運(yùn)行時(shí)會出現(xiàn)轉(zhuǎn)換異常的警告。
三、instanceof運(yùn)算符
instanceof的用處
🗡由上可知,向下轉(zhuǎn)型必須確包父類對象是子類的一個(gè)實(shí)例,否則程序會異常,
instanceof 就是為了確保向下轉(zhuǎn)型不出現(xiàn)異常。instanceof運(yùn)算符用來在運(yùn)行時(shí)
指出對象是否是特定類的一個(gè)實(shí)例
instanceof的使用格式:
🗡對象名 instanceof 類名
🗡instanceof返回一個(gè)布爾值來指出這個(gè)對象是否是這個(gè)特定類或者使他的子類的
一個(gè)實(shí)例。返回true則是,反之則不是。
public class Demo11 {
public static void main(String[] args) {
Animal a=new Dog();
if(a instanceof Dog){
Dog g=(Dog)a;
}
if( a instanceof Cat){//判斷作用
Cat c=(Cat)a;
}
}
}
🗡所以我們在進(jìn)行向下轉(zhuǎn)型之前采用instanceof運(yùn)算符可以避免一些問題。
到此這篇關(guān)于Java 多態(tài)中繼承的轉(zhuǎn)型詳解與用法分析的文章就介紹到這了,更多相關(guān)Java 多態(tài)中繼承的轉(zhuǎn)型內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot+MyBatis+AOP實(shí)現(xiàn)讀寫分離的示例代碼
高并發(fā)這個(gè)階段,肯定是需要做MySQL讀寫分離的。本文主要介紹了SpringBoot+MyBatis+AOP實(shí)現(xiàn)讀寫分離的示例代碼,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11
Java循環(huán)隊(duì)列與非循環(huán)隊(duì)列的區(qū)別總結(jié)
今天給大家?guī)淼氖顷P(guān)于Java的相關(guān)知識總結(jié),文章圍繞著Java循環(huán)隊(duì)列與非循環(huán)隊(duì)列的區(qū)別展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下2021-06-06
淺析Spring的事務(wù)實(shí)現(xiàn)原理
這篇文章主要為大家詳細(xì)介紹了Spring中事務(wù)實(shí)現(xiàn)的原理,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)Spring有一定的幫助,需要的可以參考一下2022-11-11
java網(wǎng)絡(luò)之基于UDP的聊天程序示例解析
這篇文章主要介紹了java網(wǎng)絡(luò)之基于UDP的聊天程序示例解析,文中通過步驟及示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08
Spring Boot2與Spring Boot3的區(qū)別小結(jié)
SpringBoot2和SpringBoot3之間有一些重要的區(qū)別,本文就來探討SpringBoot2和SpringBoot3之間的區(qū)別,具有一定的參考價(jià)值,感興趣的可以了解一下2023-10-10
springboot-curd基于mybatis項(xiàng)目搭建
這篇文章主要介紹了springboot-curd基于mybatis項(xiàng)目搭建,圍繞相關(guān)資料展開詳細(xì)內(nèi)容,希望對正在學(xué)習(xí)的你有所幫助,需要的小伙伴也可以參考一下2022-01-01
IDEA無法識別SpringBoot項(xiàng)目的簡單解決辦法
今天使用idea的時(shí)候,遇到idea無法啟動springboot,所以這篇文章主要給大家介紹了關(guān)于IDEA無法識別SpringBoot項(xiàng)目的簡單解決辦法,需要的朋友可以參考下2023-08-08

