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

來源:互聯網
上載者:User

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.