● 向上轉型:b extends a,a a = new b()就是向上轉型,此時a的型別為a,指向b,可以理解為把子類物件轉換成了父類物件,即父類的引用指向子類的物件,此時a不能呼叫子類自己新建的方法和變數,但若子類中重寫了父類的某個方法,那麼在呼叫這個方法時,將會呼叫子類的這個方法。向上轉型不存在風險
● 向上轉型a a = new b()中,若a中由x()和y()兩個方法,b重寫了x()方法,且增加了乙個z()方法,此時若a.x(),則這個x()是b中的,a.y(),這個y()也是b中的(因為b會預設繼承a的所有方法),a.z()會報錯。因為當父類引用指向子類物件時,被引用的物件(即子類物件)決定了呼叫誰的方法,即優先呼叫子類b的方法,若子類b中沒有覆蓋該方法,則會去父類中查詢該方法向上轉型a a = new b()中,若a中由x()和y()兩個方法,b重寫了x()方法,且增加了乙個z()方法,此時若a.x(),則這個x()是b中的,a.y(),這個y()也是b中的(因為b會預設繼承a的所有方法),a.z()會報錯。因為當父類引用指向子類物件時,被引用的物件(即子類物件)決定了呼叫誰的方法,即優先呼叫子類b的方法,若子類b中沒有覆蓋該方法,則會去父類中查詢該方法
● 不能出現b b = (b)new a()的情況,即子類引用指向父類物件
● 向下轉型,b extends a,a a = new b()後,b b = (b)a就是向下轉型,為什麼要這麼多此一舉呢,因為向下轉型後,此時的b物件又可以呼叫子類自己的方法。
● 向下轉型存在風險,所以最好先用if(a instanceof b)判斷一下
● 經典案例:
class a
public string show(a obj)
}class b extends a
public string show(a obj)
}class c extends b
class d extends b
public class demo
}
//結果:
//1–a and a //b是a的子類,所以b類物件可以是引數"a obj",所以呼叫show(a obj)
//2–a and a //c是a的間接子類,所以c類物件可以是引數"a obj",所以呼叫show(a obj)
//3–a and d //d雖然是a的間接子類,但引數直接有"d obj",所以呼叫show(d obj)
//4–b and a //a2優先從b類中呼叫方法,且show(b obj)不能被呼叫,所以呼叫show(a obj)
//5–b and a //c是a的間接子類,所以呼叫show(a obj)
//6–a and d //因為b中預設繼承了show(d obj)方法,所以呼叫b類的show(d obj)
//7–b and b //呼叫show(b obj)
//8–b and b //c是b的直接子類,所以呼叫show(b obj)
//9–a and d //因為b中預設繼承了a的show(d obj)方法,所以呼叫b類的show(d obj)
● 繼承鏈中物件方法的呼叫優先順序:this.show(o)、super.show(o)、this.show((super)o)、super.show((super)o),以上面的例子為例,分析4–a2.show(b):
第一級別:this.show(o),this指的是b,a2先在b類中查詢show(b obj),但因為a2不能呼叫b中的新增方法,this.show(o)失敗,進入下一級別:super.show(o),super指的是a,在a中尋找show(b obj)失敗,因為a中沒有這個方法,進入第**別:this.show((super)o),在b中尋找show((a)o),找到了show(a obj),選擇呼叫該方法,輸出"b and a"
java向上轉型和向下轉型
向上轉型 類a繼承類supera,類 執行suppera a new a 其實這個時候a的型別還是a而不是suppera,但是這個時候a只能使用suppera中的方法 向下轉型 分兩種1 類a繼承類supera,類 執行suppera a new a a aa a a 這個時候aa的型別是a而且可以...
向下轉型,向上轉型
package cn.dali.code24 向上轉型 父類引用指向子類物件 格式 父類名稱 物件名 new 子類名稱 向下轉型 當我們使用父類引用指向子類物件的時候,我們想把父類物件轉為子類物件時,需要向下轉型 向下轉型就是乙個還原動作。格式 子類名稱 物件名 子類名稱 父類物件 注意 乙個父類有...
向上轉型向下轉型
在引用資料型別中,只有有繼承關係的型別才能進行型別轉換 型別轉換只是轉換看待物件的引用的型別,物件本身沒有也不可能參與轉換 父類引用可以自動指向子類物件,但只能訪問和呼叫到來自於父類的屬性和行為 子類的引用不能指向父類或其它子類物件,就算強轉也會導致執行失敗並丟擲classcastexception...