題目的**如下:
class a
public string show(a obj)
}
class b extends a
public string show(a obj)
}
class c extends b{}
class d extends b{}
a a1 = new a();
a a2 = new b();
b b = new b();
c c = new c();
d d = new d();
問題:以下輸出結果是什麼?
核心要旨:(子類物件的資料型別可以自動轉型為父類型別,父類物件的資料型別轉型為子類型別,則需要強制型別轉換。)
system.out.println(a1.show(b));
a and a
// 將b類物件作為引數傳入a類物件的show方法中,b類為a類的子類,所以b類物件的資料型別會自動轉型為a類;故呼叫show(a obj)
system.out.println(a1.show(c));
a and a
// 同上,c類物件會自動型別轉換兩次,轉換為c類的爺爺類——a類型別;
system.out.println(a1.show(d));
a and d
system.out.println(a2.show(b));
b and a
// 因為是向上轉型(子類物件賦值給父類變數),所以父類的引用變數a2無法訪問子類的特有的屬性和方法;即a2無法訪問b類的 public string show(b obj)這個方法; 但可以訪問繼承自父類的那些方法,所以呼叫的是 public string show(a obj) 這個方法。
system.out.println(a2.show(c));
b and a
// 子類物件c的資料型別可以自動轉型轉型兩次,為爺爺類型別a類,所以呼叫的是b類的
public string show(a obj) 這個方法。
system.out.println(a2.show(d));
a and d
// 因為b類繼承父類a類,故也預設繼承了a類的所有方法(私有的不可訪問),所以此時呼叫的是b類中繼承自a類的public string show(d obj) 這個方法;
system.out.println(b.show(b));
b and b
system.out.println(b.show(c));
b and b
// c類物件c的資料型別會自動轉型為父類b類,故呼叫的是 public string show(b obj)這個方法;
system.out.println(b.show(d));
a and d
// 呼叫的是b類中繼承自a類的public string show(d obj) 這個方法;
面試題 多型
多型是物件導向的第三大特性 封裝 繼承 多型 用以描述現實世界中同一事物的不同形態。比如,西服 t恤和夾克都繼承至 衣服 它們都是衣服的一種形態。多型的三個條件 子類繼承父類 子類重寫父類方法 向上轉型 此外還有抽象類的多型和介面的多型 子類繼承父類 有靜態和非靜態方法分別輸出靜態和非靜態變數,子類...
C 多型面試題
答 多型是物件導向的重要特性之一,它是一種行為的封裝,是同一種事物所表現出的多種形態,簡單地說是 乙個介面多種實現 有兩種型別的多型性 編譯時的多型性。編譯時的多型性是通過過載來實現的。執行時的多型性。執行時的多型性是通過虛成員實現的。1.從儲存空間角度。虛函式對應乙個vtable,這個vtable...
多型相關面試題
多型 同樣的呼叫語句有多種不同的表現形態 同樣乙個函式在不同的子類 父類中穿梭的時候表現出不同的形態。有繼承 有virtual重寫 有父類指標指向子類物件。是通過虛函式重寫實現。virtual關鍵字,告訴編譯器這個函式要支援多型 不是根據指標型別判斷如何呼叫 而是要根據指標所指向的實際物件型別來判斷...