JAVA 基础 / 第二十九课:接口与继承 / JAVA中的对象转型
2018-03-19
一、明確引用類型與對象類型的概念
引用類型與對象類型的概念
在這個例子里,有一個對象 new ADHero(), 同時也有一個引用ad
對象是有類型的, 是ADHero
引用也是有類型的,是ADHero
通常情況下,引用類型和對象類型是一樣的
接下來要討論的類型轉換的問題,指的是引用類型和對象類型不一致的情況下的轉換問題
二、子類轉父類(向上轉型)
所謂的轉型,是指當引用類型和對象類型不一致的時候,才需要進行類型轉換
類型轉換有時候會成功,有時候會失敗(參考基本類型的類型轉換)
到底能否轉換成功? 教大家一個很簡單的判別辦法
把右邊的當做左邊來用,看說得通不
?
Hero h = new Hero(); ADHero ad = new ADHero(); h = ad;右邊ad引用所指向的對象的類型是 物理攻擊英雄
左邊h引用的類型是 普通英雄
把物理攻擊英雄 當做 普通英雄,說不說得通? 說得通,就可以轉
所有的子類轉換為父類,都是說得通的。比如你身邊的例子
蘋果手機 繼承了 手機,把蘋果手機當做普通手機使用
怡寶純凈水 繼承了 飲品, 把怡寶純凈水 當做飲品來使用
蒼老師 繼承了動物, 把蒼老師 。。。
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();//類型轉換指的是把一個引用所指向的對象的類型,轉換為另一個引用的類型 //把ad引用所指向的對象的類型是ADHero//h引用的類型是Hero//把ADHero當做Hero使用,一定可以 h = ad; } }
三、父類轉子類(向下轉型)
父類轉子類,有的時候行,有的時候不行,所以必須進行強制轉換。
強制轉換的意思就是 轉換有風險,風險自擔。
什么時候行呢?
第3行,是子類轉父類,一定可以的;第4行,就是父類轉子類,所以要進行強轉。
h這個引用,所指向的對象是ADHero, 所以第4行,就會把ADHero轉換為ADHero,就能轉換成功。
什么時候轉換不行呢?
第4行,是子類轉父類,是可以轉換成功的
第5行,是把h引用所指向的對象 Support,轉換為ad引用的類型ADHero。 從語義上講,把物理攻擊英雄,當成輔助英雄來用,說不通,所以會強制轉換失敗,并且拋出異常
以下是對完整的代碼的關鍵行分析
14行: 把ad當做Hero使用,一定可以轉換之后,h引用指向一個ad對象。
15行: h引用有可能指向一個ad對象,也有可能指向一個support對象,所以把h引用轉換成AD類型的時候,就有可能成功,有可能失敗;
因此要進行強制轉換,換句話說轉換后果自負,到底能不能轉換成功,要看引用h到底指向的是哪種對象
在這個例子里,h指向的是一個ad對象,所以轉換成ADHero類型,是可以的
16行:把一個support對象當做Hero使用,一定可以;轉換之后,h引用指向一個support對象。
17行:這個時候,h指向的是一個support對象,所以轉換成ADHero類型,會失敗;失敗的表現形式是拋出異常 ClassCastException 類型轉換異常。
?
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;} }四、沒有繼承關系的兩個類,互相轉換
沒有繼承關系的兩個類,互相轉換,一定會失敗
雖然ADHero和APHero都繼承了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(); // 沒有繼承關系的類型進行互相轉換一定會失敗,所以會出現編譯錯誤ad = (ADHero) ap;} }
五、實現類轉換成接口(向上轉型)
引用ad指向的對象是ADHero類型,這個類型實現了AD接口
10行: 把一個ADHero類型轉換為AD接口
從語義上來講,把一個ADHero當做AD來使用,而AD接口只有一個physicAttack方法,
這就意味著轉換后就有可能要調用physicAttack方法,而ADHero一定是有physicAttack方法的,所以轉換是能成功的。
package charactor;public class Hero {public String name;protected float hp;public static void main(String[] args) {ADHero ad = new ADHero(); AD adi = ad; } }六、接口轉換成實現類(向下轉型)
?10行: ad引用指向ADHero, 而adi引用是接口類型:AD,實現類轉換為接口,是向上轉型,所以無需強制轉換,并且一定能成功
12行: adi實際上是指向一個ADHero的,所以能夠轉換成功
14行: adi引用所指向的對象是一個ADHero,要轉換為ADAPHero就會失敗。?
假設能夠轉換成功,那么就可以使用magicAttack方法,而adi引用所指向的對象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 判斷一個引用所指向的對象,是否是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指向的對象,是否是ADHero類型System.out.println(h1 instanceof ADHero);//判斷引用h2指向的對象,是否是APHero類型System.out.println(h2 instanceof APHero);//判斷引用h1指向的對象,是否是Hero的子類型System.out.println(h1 instanceof Hero);} }轉載于:https://www.cnblogs.com/Parker-YuPeng/p/8598955.html
總結
以上是生活随笔為你收集整理的JAVA 基础 / 第二十九课:接口与继承 / JAVA中的对象转型的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 韩顺平 servlet 笔记 第5讲
- 下一篇: 前端性能调优之Yahoo--23条