public class Test { public static void main(String[] args) { Object obj = new Object(); Cat cat = new Cat(); System.out.PRintln(cat instanceof Cat);//true System.out.println(cat instanceof Object);//true System.out.println("----------------------"); System.out.println(obj instanceof Object);//true System.out.println(obj instanceof Cat);//false System.out.println("----------------------"); /* 父類引用指向子類對象 */ obj = cat; System.out.println(obj instanceof Object);//true System.out.println(obj instanceof Cat); //true }}class Cat { String eyesColor;}運行結果已注釋在打印語句之后。
四、父類引用指向子類對象稱作向上轉型(upcasting),父類引用類型變量強制類型轉換為子類引用類型變量稱為向下轉型(downcasting).
見下例:class Animal { public String name; Animal(String name) { this.name = name; }}class Cat extends Animal { public String eyesColor; Cat(String name, String eyesColor) { super(name); this.eyesColor = eyesColor; } }class Dog extends Animal { public String furcolor; Dog(String name, String furColor) { super(name); this.furcolor = furColor; }}public class Test { public static void main(String[] args) { Animal a = new Animal("name"); Cat c = new Cat("catname", "blue"); Dog d = new Dog("dogname", "black"); /* 引用型變量所指向的對象屬于該類 */ System.out.println(a instanceof Animal);//true /* 引用型變量所指向的對象屬于該類的子類 */ System.out.println(c instanceof Animal);//true System.out.println(d instanceof Animal);//true /* false!父類引用指向的父類對象沒有指向子類對象 * 因此不屬于子類 */ System.out.println(a instanceof Cat);//false /* * a可以看做是一個指向Dog類對象的一個引用,但由于a原來是 * Animal這個父類的對象的引用,因此a并不是真正意義上的 * Dog類的對象的引用,a無法訪問Dog類新增的成員。 * 總結:a是一個只能訪問父類部分、不能訪問子類部分的指向子類對象的引用。 */ a = new Dog("bigyellow", "yellow"); //向上轉型 System.out.println(a.name);//bigyellow /* * 雖然父類引用可以指向子類對象, * 但是父類引用不能訪問其子類對象新增加的成員(屬性和方法) * System.out.println(a.furColor);//!error */ /* * 由于a是一個只能訪問父類部分、不能訪問子類部分的指向子類對象的引用。 * 但a在訪問子類部分內容時是受限的,但a的確是指向Dog類的對象,該 * 對象屬于Animal的子類Dog類 */ System.out.println(a instanceof Animal);//true /* * 引用a的確是指向Dog類對象的,該對象屬于Dog類 */ System.out.println(a instanceof Dog);//true Dog d1 = (Dog)a; //向下轉型,強制類型轉換 System.out.println(d1.furcolor);//yellow }}運行結果已注釋在打印語句之后。
該程序的部分內存圖如下圖所示:
Animal a = new Animal("name"); //引用a本來是指向一個Animal類對象的。
a = new Dog("bigyellow", "yellow"); //讓父類引用a指向子類對象,稱為向下轉型(downcasting)。
a所指向的這個子類對象中:父類成員變量name初始值為"bigyellow",子類成員變量furColor初始值為"yellow"。
雖然a指向了子類Dog對象,但它是Animal類型的引用,所以即便指向子類Dog對象,a也只看到了其中的父類部分(如圖中虛線箭頭所示)。
因此只能通過a.name的方式訪問父類部分的name,而無法通過a.furColor的方式去訪問子類部分的furColor。
Dog d1 = (Dog)a; //將a從Animal類型強制類型轉換為Dog類型,從父類類型轉換到子類類型,稱為向下轉型(downcasting)。
在引用d1與a一樣可以指向該對象時,因為引用d1是Dog類型的,它當然可以看到整個對象(包括子類部分),所以d1.furColor是合法的。
新聞熱點
疑難解答