日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

JAVA 基础 / 第二十九课:接口与继承 / JAVA中的对象转型

發(fā)布時(shí)間:2025/4/9 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JAVA 基础 / 第二十九课:接口与继承 / JAVA中的对象转型 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

2018-03-19

一、明確引用類型與對(duì)象類型的概念

引用類型與對(duì)象類型的概念
在這個(gè)例子里,有一個(gè)對(duì)象 new ADHero(), 同時(shí)也有一個(gè)引用ad
對(duì)象是有類型的, 是ADHero
引用也是有類型的,是ADHero
通常情況下,引用類型和對(duì)象類型是一樣的
接下來要討論的類型轉(zhuǎn)換的問題,指的是引用類型和對(duì)象類型不一致的情況下的轉(zhuǎn)換問題

package charactor;public class Hero {public String name;protected float hp;public static void main(String[] args) {ADHero ad = new ADHero();} }

二、子類轉(zhuǎn)父類(向上轉(zhuǎn)型)

所謂的轉(zhuǎn)型,是指當(dāng)引用類型和對(duì)象類型不一致的時(shí)候,才需要進(jìn)行類型轉(zhuǎn)換
類型轉(zhuǎn)換有時(shí)候會(huì)成功,有時(shí)候會(huì)失敗(參考基本類型的類型轉(zhuǎn)換)
到底能否轉(zhuǎn)換成功? 教大家一個(gè)很簡(jiǎn)單的判別辦法
把右邊的當(dāng)做左邊來用,看說得通不

?

Hero h = new Hero(); ADHero ad = new ADHero(); h = ad;

右邊ad引用所指向的對(duì)象的類型是 物理攻擊英雄
左邊h引用的類型是 普通英雄
把物理攻擊英雄 當(dāng)做 普通英雄,說不說得通? 說得通,就可以轉(zhuǎn)
所有的子類轉(zhuǎn)換為父類,都是說得通的。比如你身邊的例子
蘋果手機(jī) 繼承了 手機(jī),把蘋果手機(jī)當(dāng)做普通手機(jī)使用
怡寶純凈水 繼承了 飲品, 把怡寶純凈水 當(dāng)做飲品來使用
蒼老師 繼承了動(dòng)物, 把蒼老師 。。。

package charactor;public class Hero {public String name;protected float hp;public static void main(String[] args) { Hero h = new Hero(); ADHero ad = new ADHero();//類型轉(zhuǎn)換指的是把一個(gè)引用所指向的對(duì)象的類型,轉(zhuǎn)換為另一個(gè)引用的類型 //把a(bǔ)d引用所指向的對(duì)象的類型是ADHero//h引用的類型是Hero//把ADHero當(dāng)做Hero使用,一定可以 h = ad; } }

三、父類轉(zhuǎn)子類(向下轉(zhuǎn)型)

父類轉(zhuǎn)子類,有的時(shí)候行,有的時(shí)候不行,所以必須進(jìn)行強(qiáng)制轉(zhuǎn)換。
強(qiáng)制轉(zhuǎn)換的意思就是 轉(zhuǎn)換有風(fēng)險(xiǎn),風(fēng)險(xiǎn)自擔(dān)。
什么時(shí)候行呢?

Hero h =new Hero(); ADHero ad = new ADHero(); h = ad; ad = (ADHero) h;

第3行,是子類轉(zhuǎn)父類,一定可以的;第4行,就是父類轉(zhuǎn)子類,所以要進(jìn)行強(qiáng)轉(zhuǎn)。
h這個(gè)引用,所指向的對(duì)象是ADHero, 所以第4行,就會(huì)把ADHero轉(zhuǎn)換為ADHero,就能轉(zhuǎn)換成功。
什么時(shí)候轉(zhuǎn)換不行呢?

Hero h =new Hero(); ADHero ad = new ADHero(); Support s =new Support(); h = s; ad = (ADHero)h;

第4行,是子類轉(zhuǎn)父類,是可以轉(zhuǎn)換成功的
第5行,是把h引用所指向的對(duì)象 Support,轉(zhuǎn)換為ad引用的類型ADHero。 從語義上講,把物理攻擊英雄,當(dāng)成輔助英雄來用,說不通,所以會(huì)強(qiáng)制轉(zhuǎn)換失敗,并且拋出異常

以下是對(duì)完整的代碼的關(guān)鍵行分析
14行: 把a(bǔ)d當(dāng)做Hero使用,一定可以轉(zhuǎn)換之后,h引用指向一個(gè)ad對(duì)象。
15行: h引用有可能指向一個(gè)ad對(duì)象,也有可能指向一個(gè)support對(duì)象,所以把h引用轉(zhuǎn)換成AD類型的時(shí)候,就有可能成功,有可能失敗;
因此要進(jìn)行強(qiáng)制轉(zhuǎn)換,換句話說轉(zhuǎn)換后果自負(fù),到底能不能轉(zhuǎn)換成功,要看引用h到底指向的是哪種對(duì)象
在這個(gè)例子里,h指向的是一個(gè)ad對(duì)象,所以轉(zhuǎn)換成ADHero類型,是可以的
16行:把一個(gè)support對(duì)象當(dāng)做Hero使用,一定可以;轉(zhuǎn)換之后,h引用指向一個(gè)support對(duì)象。
17行:這個(gè)時(shí)候,h指向的是一個(gè)support對(duì)象,所以轉(zhuǎn)換成ADHero類型,會(huì)失敗;失敗的表現(xiàn)形式是拋出異常 ClassCastException 類型轉(zhuǎn)換異常。

?

package charactor;import charactor1.Support;public class Hero {public String name;protected float hp; public static void main(String[] args) {Hero h =new Hero();ADHero ad = new ADHero();Support s =new Support(); h = ad;ad = (ADHero) h;h = s;ad = (ADHero)h;} }

四、沒有繼承關(guān)系的兩個(gè)類,互相轉(zhuǎn)換

沒有繼承關(guān)系的兩個(gè)類,互相轉(zhuǎn)換,一定會(huì)失敗
雖然ADHero和APHero都繼承了Hero,但是彼此沒有互相繼承關(guān)系
"把魔法英雄當(dāng)做物理英雄來用",在語義上也是說不通的

package charactor;public class Hero {public String name;protected float hp;public static void main(String[] args) {ADHero ad = new ADHero(); APHero ap = new APHero(); // 沒有繼承關(guān)系的類型進(jìn)行互相轉(zhuǎn)換一定會(huì)失敗,所以會(huì)出現(xiàn)編譯錯(cuò)誤ad = (ADHero) ap;} }

五、實(shí)現(xiàn)類轉(zhuǎn)換成接口(向上轉(zhuǎn)型)

引用ad指向的對(duì)象是ADHero類型,這個(gè)類型實(shí)現(xiàn)了AD接口
10行: 把一個(gè)ADHero類型轉(zhuǎn)換為AD接口
從語義上來講,把一個(gè)ADHero當(dāng)做AD來使用,而AD接口只有一個(gè)physicAttack方法,

這就意味著轉(zhuǎn)換后就有可能要調(diào)用physicAttack方法,而ADHero一定是有physicAttack方法的,所以轉(zhuǎn)換是能成功的。

package charactor;public class Hero {public String name;protected float hp;public static void main(String[] args) {ADHero ad = new ADHero(); AD adi = ad; } }

六、接口轉(zhuǎn)換成實(shí)現(xiàn)類(向下轉(zhuǎn)型)

?10行: ad引用指向ADHero, 而adi引用是接口類型:AD,實(shí)現(xiàn)類轉(zhuǎn)換為接口,是向上轉(zhuǎn)型,所以無需強(qiáng)制轉(zhuǎn)換,并且一定能成功
12行: adi實(shí)際上是指向一個(gè)ADHero的,所以能夠轉(zhuǎn)換成功
14行: adi引用所指向的對(duì)象是一個(gè)ADHero,要轉(zhuǎn)換為ADAPHero就會(huì)失敗。?
假設(shè)能夠轉(zhuǎn)換成功,那么就可以使用magicAttack方法,而adi引用所指向的對(duì)象ADHero沒有magicAttack方法的。

?

package charactor;public class Hero {public String name;protected float hp;public static void main(String[] args) {ADHero ad = new ADHero();AD adi = ad; ADHero adHero = (ADHero) adi; ADAPHero adapHero = (ADAPHero) adi;adapHero.magicAttack();} }

七、instanceof

?instanceof Hero 判斷一個(gè)引用所指向的對(duì)象,是否是Hero類型,或者Hero的子類

package charactor;public class Hero {public String name;protected float hp;public static void main(String[] args) {ADHero ad = new ADHero();APHero ap = new APHero();Hero h1= ad;Hero h2= ap;//判斷引用h1指向的對(duì)象,是否是ADHero類型System.out.println(h1 instanceof ADHero);//判斷引用h2指向的對(duì)象,是否是APHero類型System.out.println(h2 instanceof APHero);//判斷引用h1指向的對(duì)象,是否是Hero的子類型System.out.println(h1 instanceof Hero);} }

轉(zhuǎn)載于:https://www.cnblogs.com/Parker-YuPeng/p/8598955.html

總結(jié)

以上是生活随笔為你收集整理的JAVA 基础 / 第二十九课:接口与继承 / JAVA中的对象转型的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。