java父子類例項強制轉化後 各例項之間的關係

2021-08-20 18:26:43 字數 1887 閱讀 1639

子類例項轉化為父類例項後 是否還從屬(instanceof)於子類?

這個被轉化得來的父類例項是否能訪問子類重寫的方法、子類新新增的方法、子類新新增的成員屬性、是否還能轉化為子類例項?以下測試:

建立乙個父類和乙個子類,父類擁有成員變數a、方法fun(),子類擁有繼承的成員變數a、新定義的成員變數b、重寫的方法fun()、新定義的方法fun2()

class father

public father()

public void fun()

}class son extends father

public void fun()

public void fun2()

}

再main函式建立子類例項s,強制轉化為f,再把f強制轉化為s1

son s = new son(1, 2);

father f = (father)s;

son s1 = (son)f;

測試以上三個例項能否訪問子類新定義的成員變數,重寫的方法,新定義的方法

system.out.println(s.b);

// system.out.println(f.b);子類轉換為父類就不能訪問子類自定義的屬性了

system.out.println(s1.b);//但是再強轉回來子類原本的自定義屬性和方法又「失而復得」

s.fun();

f.fun();

s1.fun();

// f.fun2();子類轉換為父類就不能訪問子類自定義的方法了

s1.fun2();//但是再強轉回來子類原本的自定義屬性和方法又「失而復得」

得到如下結果

2

2子類重寫父類方法fun已經執行

子類重寫父類方法fun已經執行

子類重寫父類方法fun已經執行

子類新增加的方法fun2已經執行

說明:子類轉化為父類例項後,這個例項就不能訪問子類新增加的成員變數和新增加成員方法了,值得一提的是,這個父類例項雖然被轉換為乙個父類例項,但呼叫重寫方法,執行的仍是子類重寫過的內容。

但是再由這個父類例項轉換為子類例項,則這個子類例項s1和之前初始化的子類例項s沒有區別,不會因為轉換過程而丟失成員變數和成員方法

那麼,這三個例項屬於(instanceof)父類或子類麼?測試結果為既屬於父類例項,也屬於子類例項

if(s instanceof father)

if(f instanceof father)

if(s1 instanceof father)

if(s instanceof son)

if(f instanceof son)

if(s1 instanceof son)

結果:

子類的例項s 屬於父類例項

父類的例項f 屬於父類例項

子類的例項s1 屬於父類例項

子類的例項s 屬於子類例項

父類的例項f 屬於子類例項

子類的例項s1 屬於子類例項

再那麼,普通new出的父類例項是不是也屬於(instanceof)子類的例項呢?

father father = new father(1);

if(father instanceof son)else

得到結果:

什麼也沒發生
所以new得到的父類例項不屬於自己的子類,子類例項必然屬於父類(這點就不用證明了,任何類物件都屬於object)。

Java父子類載入順序

先上桌結論 父類靜態屬性 成員變數 父類靜態 塊 子類靜態屬性 子類靜態 塊 父類非靜態屬性 父類非靜態 塊 父類構造器 子類非靜態屬性 子類非靜態 塊 子類構造器 這麼長怎麼記呀?靜態屬性和 塊,當且僅當該類在程式中第一次被 new 或者第一次被類載入器呼叫時才會觸發 不考慮永久代的 也正是因為上...

java父子類異常處理規則

說明下此處的異常都為檢查時異常 非執行時異常 1 對於子類構造器 1 1 由於無法捕獲父類構造器異常,所以必須丟擲大於或等於父類構造器丟擲的異常 1 2 可以新增其它異常 2 對於子類方法 2 1 可以選擇不丟擲異常 2 2 丟擲異常則必須遵從父類方法丟擲的異常 異常型別小於等於父類異常,因為在向上...

java記錄學習 String 強制轉化int

string str char temp char str.charat i temp char不是字串,而是該字元對應ascii值.把字元轉換成數字方法一 int temp int temp char 0 把字元轉換成數字方法二 int temp int integer.parseint stri...