子類例項轉化為父類例項後 是否還從屬(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...