一、前言
前面我們學(xué)習(xí)了多態(tài)的概述和使用,現(xiàn)在我們來學(xué)習(xí)前面剩下的轉(zhuǎn)型問題。
二、轉(zhuǎn)型
向上轉(zhuǎn)型
向下轉(zhuǎn)型
為什么會有轉(zhuǎn)型呢,前面我們也說到了,多態(tài)中的使用前提是有父類引用指向子類對象
還有多態(tài)的缺點就是不能訪問子類對象。(可以用到向下轉(zhuǎn)型訪問)
向上轉(zhuǎn)型
其實多態(tài)中的父類引用指向子類對象就是向下轉(zhuǎn)型,向下轉(zhuǎn)型就是子到父。
就是將子類所申請的空間賦值給父類。形式: fu f=new zi();
向下轉(zhuǎn)型
向下轉(zhuǎn)型的出現(xiàn)就是為了解決多態(tài)中無法訪問子類成員的問題,其實向下轉(zhuǎn)型本質(zhì)上
就是強轉(zhuǎn),由父到子,父類對象轉(zhuǎn)化為子類對象。形式:zi z= (zi)f ;
我們看個例子:
在fu類中
1
2
3
4
5
6
7
8
|
public class Fu { public void show(){ System.out.println( "fu:1024程序員節(jié)" ); } public void play(){ System.out.println( "fu:1024不見不散" ); } } |
zi類中
1
2
3
4
5
6
7
8
9
10
11
12
13
|
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:全員卷王" ); } } |
新建一個測試類
1
2
3
4
5
6
7
8
9
10
|
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)型,此時我們可以訪問子類父類全部成員
其實雖然直接創(chuàng)建子類對象是非常方便的,但是我們多態(tài)的實現(xiàn)條件之一就是有
父類引用指向子類對象(接口的多態(tài)暫時不考慮)
1
2
3
4
5
6
7
8
9
10
11
|
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)化
為子類對象時,需要顯示強制類型轉(zhuǎn)化。
友情提示:向下轉(zhuǎn)型還有幾點需要注意的地方:
①必須保證父類對象是子類的一個實例,否則程序報錯。
②向下轉(zhuǎn)型的對象可以訪問父類中的成員和方法,也可以訪問子類中的成員和方法。
1
2
3
4
5
6
7
8
|
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強
制轉(zhuǎn)化為Dog類型,不能a強制轉(zhuǎn)化為Cat類型,因為向下轉(zhuǎn)型必須確保父類對象是
子類的一個實例所以這個程序不能成功,且在運行時會出現(xiàn)轉(zhuǎn)換異常的警告。
三、instanceof運算符
instanceof的用處
由上可知,向下轉(zhuǎn)型必須確包父類對象是子類的一個實例,否則程序會異常,
instanceof 就是為了確保向下轉(zhuǎn)型不出現(xiàn)異常。instanceof運算符用來在運行時
指出對象是否是特定類的一個實例
instanceof的使用格式:
對象名 instanceof 類名
instanceof返回一個布爾值來指出這個對象是否是這個特定類或者使他的子類的
一個實例。返回true則是,反之則不是。
1
2
3
4
5
6
7
8
9
10
11
|
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; } } } |
所以我們在進行向下轉(zhuǎn)型之前采用instanceof運算符可以避免一些問題。
到此這篇關(guān)于Java 多態(tài)中繼承的轉(zhuǎn)型詳解與用法分析的文章就介紹到這了,更多相關(guān)Java 多態(tài)中繼承的轉(zhuǎn)型內(nèi)容請搜索服務(wù)器之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持服務(wù)器之家!
原文鏈接:https://blog.csdn.net/weixin_60719453/article/details/120945253