作者: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表現出多態性,會調用更具體的子類里面的方法,無論從哪里調用,無論使用什么引用類型調用。
另外說說向上轉型的作用:由於向上轉型的作用,在要傳入子類實例的時候,我們可以方便的將父類實例作為參數定義在方法的傳入參數上,這樣不用利用多態特性進行方法的重載了。其實向上轉型也是一種多態特性的體現。