作者:gnuhpc
出處:http://www.cnblogs.com/gnuhpc/
見下邊的程式段
package test;
class A {
public String f(A obj)
{
return("A");
}
}
class B extends A {
public String f(B obj)
{
return("C");
}
public String f(A obj)
{
return("D");
}
}
我們使用子類建立一個對象:
B b = new B();
然後再將這個子類的引用放到父類對象中:
A a;
a = b;
那麼這個父類對象a是子類對象b的上轉型對象,對象的實體由子類負責建立,實質還是子類,只是損失了一些功能而已,這樣的得失具體如下:
得:上轉型對象可以操作和使用子類繼承或者重寫的方法。
失:上轉型對象喪失了對子類新增成員變數或新增的方法的操作和使用。
那麼下邊的這段測試代碼的列印結果就是“D”,因為a2隻能有public String f(A obj) 這個方法是可以用的。
public class TestObj
{
public static void main(String args[])
{ A a1 = new A();
A a2 = new B(); //子類對象轉化為父類,稱為上轉型,不需要強制轉換。
B b = new B();
System.out.println(a2.f(b)); //“D”
System.out.println();
if (a2 instanceof B) {
B b1 = (B) a2; //父類對象轉化為下轉型,此時需要使用強制轉換,此時需要先判斷要轉換的這個對象(也就是a2指向的這個對象)是不是B類的執行個體
System.out.println(b1.f(b));//"C"
System.out.println(b1.f(a1));//"D"
}
}
}
其實,java 轉型問題其實並不複雜,只要記住一句話:父類引用指向子類對象。子類和父類中定義同名的變數時,僅僅是隱藏了,變數沒有多態性;而對於覆蓋的方法,Java表現出多態性,會調用更具體的子類裡面的方法,無論從哪裡調用,無論使用什麼參考型別調用。
另外說說向上轉型的作用:由於向上轉型的作用,在要傳入子類執行個體的時候,我們可以方便的將父類執行個體作為參數定義在方法的傳入參數上,這樣不用利用多態特性進行方法的重載了。其實向上轉型也是一種多態特性的體現。
作者:gnuhpc
出處:http://www.cnblogs.com/gnuhpc/