首先從乙個例子看:
class a
static int g(int n)
} class b extends a
static int g(int n)
} public class printmethod
}
輸出的結果為:98.0和9
解析:a a = new b( )
;(b是
a的子類
)將a的索引指向
b的物件
a;建立了乙個
a型別,
b的乙個物件;也就是建立了乙個
b的物件a,是
a型別的。也就是向上轉型;
由於子類可以繼承父類的靜態方法,但是不能重寫父類的靜態方法,所以本題中
a.g(3)是呼叫的是父類的g()方法;而a.f(10.0, 8.0)則是呼叫的是子類的f()方法。
注:不論向上或者向下轉型,
「編譯看左邊,執行看右邊」。也就是編譯時候,會看左邊引用型別是否能正確編譯通過,執行的時候是呼叫右邊的物件的方法。
從下面的乙個例子來再一次說明:
例子:
a a = new b();例項化乙個子類物件a,這個是典型的多型
相當於:動物 a=new狗();
//這就為向上轉型
a.發聲
(); //物件a
可以使用動物中的發聲
()或其他方法,但不可以呼叫狗的方法。
a a = new a();例項化乙個父類的物件a
動物 a=new狗
();狗
b=(狗)a;
//這裡是向下轉型
這時b可呼叫動物類未被重寫的方法和狗類所有方法(包括重寫動物類的方法)
向上轉型都會成功,是安全的。
就像說狗是動物沒問題。但通過b若呼叫 動物 或 狗類中任意方法都報異常,也就是說向下轉型可能會出錯 不能說動物是狗
向上轉型和向下轉型
向上轉型 子類向上轉型為父類 注意點 轉型後父類與子類的同名函式中,子類的函式可以覆蓋父類的函式,但子類自己定義的函式將被隱藏 class a public void a2 class b extends a public void b2 public class c 向下轉型 父類被強制轉型為子類...
向上轉型和向下轉型
例如我現在有兩個類,他們之間是繼承的關係 class animal class dog extends animal void bark 通俗地講,向上轉型就是把子類的物件轉化為父類的物件,如 animal animal new dog 但是注意,向上轉型後,父類只能訪問與子類共有的方法,如以下 就...
向上轉型和向下轉型
在j a中,繼承是乙個重要的特徵,通過extends關鍵字,子類可以復用父類的功能,如果父類不能滿足當前子類的需求,則子類可以重寫父類中的方法來加以擴充套件。而在應用中就存在著兩種轉型方式。比如有父類parent,子類child1.向上轉型 父類的引用指向子類的例項parent p new chil...