public class TestCasting2{ public static void main(String args[]){ TestCasting2 test2= new TestCasting2(); Animal a = new Animal("animalName"); Dog d = new Dog("dogName","dogColor"); Cat c = new Cat("catName","catColor"); test2.f(a); test2.f(d); test2.f(c); } public void f(Animal a){ //父類引用型引數,達到了物件導向苦苦追求的可複用性,多種型別的物件,共同使用一個方法 System.out.println(a.name); if(a instanceof Dog){ Dog d2 = (Dog)a; //強制轉換,然後就可以使用子類當中的屬性了 System.out.println(d2.folorColor); }else if(a instanceof Cat){ Cat c2 = (Cat)a; System.out.println(c2.eyesColor); } //這裡有過還有一個鳥物件,只需要加一個if判斷語句就ok了,不需要重寫一個方法public void f2(Bird bird){} } } class Animal{ public String name; public Animal(String name){ this.name = name; } } class Dog extends Animal{ public String folorColor; public Dog(String name,String folorColor){ super(name); this.folorColor = folorColor; } } class Cat extends Animal{ public String eyesColor; public Cat(String name,String eyesColor){ super(name); this.eyesColor = eyesColor; } }
程式執行結果:
總結:
這邊文章的基本記錄就是:我們建立一個方法,方法的引數是父類的引用。而我們實際當中傳的是子類的物件,這樣我們就可以多個物件同時使用這一個方法了。然後我們在方法中通過強制型別轉換,呼叫各個物件的各個屬性。
通過這種物件的向上轉型方法可以使我們的程式碼可複用性提高一些,但並不是可複用性達到了最好,詳情見下一遍文章。
通過物件轉型,達到了物件導向的可複用性。就好比:我要蓋好一座大樓,然後要在大樓邊上加一個廚房,我們只需直接蓋廚房就好了。而不是將樓房的主題建築拆掉,然後重新蓋一次樓房。