java的引用類型轉換分爲兩種:java
現存在一個Animal動物類,貓子類和狗子類繼承於Animal父類;數組
1 public class Animal { 2 private String name; 3 4 public String getName() { 5 return name; 6 } 7 8 public void setName(String name) { 9 this.name = name; 10 } 11 12 public void eat() { 13 14 } 15 } 16 17 public class Cat extends Animal { 18 public void eatFish() { 19 System.out.println("貓吃魚"); 20 } 21 } 22 23 public class Dog extends Animal { 24 public void eatBone() { 25 System.out.println("狗吃骨頭"); 26 } 27 }
實例化一個cat對象,以下:優化
1 Cat cat1 = new Cat(); //使用子類引用實例化子類對象 2 3 Animal cat2 = cat1; 4 //此時爲向上引用轉換,小類型轉換爲大類型,並無風險 5 6 //Cat cat3 = cat2; //報錯 7 //因爲cat2已是Animal類的引用,因此此時爲向下引用轉換,即大類型轉換爲小類型,有數據溢出的風險 8 //雖然有風險,但也能夠強制轉換 9 Cat cat3 = (Cat)cat2; //強制轉換成功 10 11 //Dog dog1 = cat2; //由於子類不一樣因此不能這樣引用 12 //Dog dog1 = (Dog)cat2; //即便強制轉換也不行
雖然向下引用轉換會存在風險,可是能夠利用java的instanceof關鍵字去解決這個問題。instanceof運算符用法:判斷是一個實例對象是否屬於一個類,是返回true,不然返回false。這樣咱們能夠優化上面的代碼避免強制轉換類型時出現的問題:this
1 /** 2 * instanceof運算符用法 3 * 運算符是雙目運算符,左面的操做元是一個對象,右面是一個類.當 4 * 左面的對象是右面的類建立的對象時,該運算符運算的結果是true,不然是false 5 * 6 * 說明:(1)一個類的實例包括自己的實例,以及全部直接或間接子類的實例 7 * (2)instanceof左邊操做元顯式聲明的類型與右邊操做元必須是同種類或右邊是左邊父類的繼承關係, 8 * (3)不一樣的繼承關係下,編譯出錯 9 */ 10 if(cat2 instanceof Dog) { 11 Dog dog = (Dog)cat2; 12 }else { 13 System.out.println("並不能轉換"); 14 }
可是當子類實例對象統一放進父類引用對象數組時,若要使用子類中的方法,必須先向下轉換類型爲子類引用,否則編譯器會報錯spa
1 Animal[] animals = { 2 new Cat(), 3 new Dog() 4 }; 5 6 7 //animals[1].eatFish(); //報錯 8 if(animals[1] instanceof Cat) { 9 Cat cat = (Cat)animals[1]; 10 }