【Java學習筆記】上轉型與下轉型


作者: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/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM