日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

java多態(tài)、動態(tài)綁定與靜態(tài)綁定、向上轉(zhuǎn)型、傳值引用和傳引引用

 Mis林桑 2017-03-15

      分類: Java

java多態(tài)是其語言一大特性,對多態(tài)最直接的理解可以是認為同一方法在不同條件下使用會有不同的效果。就像在不同狀態(tài)下對同一操作進行觸發(fā)操作得到的結果不同。舉個例子:在計算機里面不同的菜單下同樣按下按鍵K獲取的結果不一樣。還是先來看幾個代碼深入理解一下:

student st=new student(); st.print(2); st.print(2,3); st.print(2,3,5); st.print(1.1); st.print(1.1,2.2); st.print(1.1,2.2,3.3);

            創(chuàng)建學生對象st,對象可以調(diào)用同一方法名,但是參數(shù)類型和參數(shù)個數(shù)可以不同,前面說過可以認為這是方法重載。這也是多態(tài)的一種,是屬于一種靜態(tài)綁定。重載與覆蓋多屬于多態(tài)中的一種情況。

關于靜態(tài)綁定

            在程序執(zhí)行前方法已經(jīng)被綁定,此時由編譯器或其它連接程序?qū)崿F(xiàn)。

      針對java簡單的可以理解為程序編譯期的綁定;

關于動態(tài)綁定

            動態(tài)綁定是指在執(zhí)行期間(非編譯期)判斷所引用對象的實際類型,根據(jù)其實際的類型調(diào)用其相應的方法。程序運行過程中,把函數(shù)(或過程)調(diào)用與響應調(diào)用所需要的代碼相結合的過程稱為動態(tài)綁定。動態(tài)綁定是一種后期綁定:在運行時根據(jù)具體對象的類型進行綁定。提起這個還需要提一下向上轉(zhuǎn)型:

關于向上轉(zhuǎn)型

            向上轉(zhuǎn)型多與覆蓋技術相結合。例如:father s= new son();son類就是繼承father類得到的,那么這時候可以這么理解:對象s是son類的實例對象,但是又屬于父類,然后把它強制轉(zhuǎn)型為father類對象。所以father類方法被子類son類中的方法覆蓋。來看下面這個實例:

class A{ publicvoidA1(){ System.out.println('父類方法1'); } publicvoidA2(){ System.out.println('父類方法2'); } } class B extends A{ publicvoidA1() { System.out.println('子類方法1'); } publicvoidB2() { System.out.println('子類方法2'); } } publicclassC{publicstaticvoidmain(String args[]){ A a=new B(); } }

            上面給出了A類與B類的繼承關系,B類作為A類的子類除了擴展了自己的B2()方法還有父類A1方法。這樣A a=new B(); 就產(chǎn)生了向上轉(zhuǎn)型。對象a雖然是B的實例對象,但是卻強制轉(zhuǎn)換為A類對象。接下來可以做一下下面的三個測試:

a.A1(); a.A2(); a.B2();

      來看一下輸出:

      子類方法1

      父類方法2

      輸出a.B2()時會報錯

            分析一下上面的結果,a.A1();語句執(zhí)行后子類會對父類的A1()方法產(chǎn)生覆蓋,因此執(zhí)行的是子類的A1()方法。這一點理解很重要。執(zhí)行a.A2();由于向上轉(zhuǎn)型強制轉(zhuǎn)換父類A對象后就可以調(diào)用父類A的A2方法。那么第三條執(zhí)行語句會報錯呢?a.B2();說明對象a無法調(diào)用子類對象B2()方法。這還是要回到向上轉(zhuǎn)型上面來,因為對象a向上轉(zhuǎn)型以后只能執(zhí)行父類的方法,但是子類方法會對父類方法產(chǎn)生覆蓋影響。這也就是動態(tài)綁定的過程。當然還有向下轉(zhuǎn)型和動態(tài)綁定跟深入的理解,推薦閱讀《java編程思想》。

關于java超類

            用java術語來講,被繼承的類稱為超類(SuperClass),也有叫做父類,繼承的類稱為子類。java中的默認的超類是object類。

關于java傳值引用和傳引引用

             傳值就是你改變這個值,不會改變原值。例如 int a=1;把a作為參數(shù)經(jīng)過方法調(diào)用,在方法中改變a的值如。a=2;在方法中a是變成2了。但是在方法外面a還是1。如果是傳引用,值是會變的。

      基本數(shù)據(jù)類型傳遞時值傳遞;對象傳遞都是引用傳遞;

      注意以下幾點:

      1 .基本類型和String型作為參數(shù)時,為傳值方式,只把值傳入方法,不管在方法中怎么處理這個參數(shù),原值不變。

      2 其他引用類型作為參數(shù)時,為傳址方式,將指向內(nèi)存中的地址傳入方法,方法中此內(nèi)存地址中的值發(fā)生變化時,原值也會改變。

      3 如果引用類型的對象通過傳址方式將其指向內(nèi)存中的地址傳入方法后,方法中使用new關鍵字重新給參數(shù)賦值時,會在內(nèi)存中重新開辟空間,參數(shù)指向新的內(nèi)存空間,此時參數(shù)和原對象指向的就不是同一個地址了,參數(shù)值的變化不會改變原值;

      4 字符串在內(nèi)存中是存儲在堆中的一個常量,String對象指向內(nèi)存中這個常量的地址,通過傳址方式將地址傳入方法后,方法中如果通過字符串給參數(shù)賦值,則會重新在堆中創(chuàng)建一個字符串常量,并指向這個地址,原值依然指向原來的字符串常量地址,參數(shù)值的變化不會改變原值。

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多