乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      Java靜態(tài)綁定與動(dòng)態(tài)綁定

       臭小子的共享 2015-04-05
      程序綁定的概念:
      綁定指的是一個(gè)方法的調(diào)用與方法所在的類(lèi)(方法主體)關(guān)聯(lián)起來(lái)。對(duì)java來(lái)說(shuō),綁定分為靜態(tài)綁定和動(dòng)態(tài)綁定;或者叫做前期綁定和后期綁定.

      靜態(tài)綁定:
      在程序執(zhí)行前方法已經(jīng)被綁定(也就是說(shuō)在編譯過(guò)程中就已經(jīng)知道這個(gè)方法到底是哪個(gè)類(lèi)中的方法),此時(shí)由編譯器或其它連接程序?qū)崿F(xiàn)。例如:C。
      針對(duì)java簡(jiǎn)單的可以理解為程序編譯期的綁定;這里特別說(shuō)明一點(diǎn),java當(dāng)中的方法只有final,static,private和構(gòu)造方法是前期綁定

      動(dòng)態(tài)綁定:
      后期綁定:在運(yùn)行時(shí)根據(jù)具體對(duì)象的類(lèi)型進(jìn)行綁定。
      若一種語(yǔ)言實(shí)現(xiàn)了后期綁定,同時(shí)必須提供一些機(jī)制,可在運(yùn)行期間判斷對(duì)象的類(lèi)型,并分別調(diào)用適當(dāng)?shù)姆椒āR簿褪钦f(shuō),編譯器此時(shí)依然不知道對(duì)象的類(lèi)型,但方法調(diào)用機(jī)制能自己去調(diào)查,找到正確的方法主體。不同的語(yǔ)言對(duì)后期綁定的實(shí)現(xiàn)方法是有所區(qū)別的。但我們至少可以這樣認(rèn)為:它們都要在對(duì)象中安插某些特殊類(lèi)型的信息。
      動(dòng)態(tài)綁定的過(guò)程:
      1. 虛擬機(jī)提取對(duì)象的實(shí)際類(lèi)型的方法表;
      2. 虛擬機(jī)搜索方法簽名;
      3. 調(diào)用方法。

      關(guān)于final,static,private和構(gòu)造方法是前期綁定的理解
      對(duì)于private的方法,首先一點(diǎn)它不能被繼承,既然不能被繼承那么就沒(méi)辦法通過(guò)它子類(lèi)的對(duì)象來(lái)調(diào)用,而只能通過(guò)這個(gè)類(lèi)自身的對(duì)象來(lái)調(diào)用。因此就可以說(shuō)private方法和定義這個(gè)方法的類(lèi)綁定在了一起。
      final方法雖然可以被繼承,但不能被重寫(xiě)(覆蓋),雖然子類(lèi)對(duì)象可以調(diào)用,但是調(diào)用的都是父類(lèi)中所定義的那個(gè)final方法,(由此我們可以知道將方法聲明為final類(lèi)型,一是為了防止方法被覆蓋,二是為了有效地關(guān)閉java中的動(dòng)態(tài)綁定)。
      構(gòu)造方法也是不能被繼承的(網(wǎng)上也有說(shuō)子類(lèi)無(wú)條件地繼承父類(lèi)的無(wú)參數(shù)構(gòu)造函數(shù)作為自己的構(gòu)造函數(shù),不過(guò)個(gè)人認(rèn)為這個(gè)說(shuō)法不太恰當(dāng),因?yàn)槲覀冎雷宇?lèi)是通過(guò)super()來(lái)調(diào)用父類(lèi)的無(wú)參構(gòu)造方法,來(lái)完成對(duì)父類(lèi)的初始化, 而我們使用從父類(lèi)繼承過(guò)來(lái)的方法是不用這樣做的,因此不應(yīng)該說(shuō)子類(lèi)繼承了父類(lèi)的構(gòu)造方法),因此編譯時(shí)也可以知道這個(gè)構(gòu)造方法到底是屬于哪個(gè)類(lèi)。
      對(duì)于static方法,具體的原理我也說(shuō)不太清。不過(guò)根據(jù)網(wǎng)上的資料和我自己做的實(shí)驗(yàn)可以得出結(jié)論:static方法可以被子類(lèi)繼承,但是不能被子類(lèi)重寫(xiě)(覆蓋),但是可以被子類(lèi)隱藏。(這里意思是說(shuō)如果父類(lèi)里有一個(gè)static方法,它的子類(lèi)里如果沒(méi)有對(duì)應(yīng)的方法,那么當(dāng)子類(lèi)對(duì)象調(diào)用這個(gè)方法時(shí)就會(huì)使用父類(lèi)中的方法。而如果子類(lèi)中定義了相同的方法,則會(huì)調(diào)用子類(lèi)的中定義的方法。唯一的不同就是,當(dāng)子類(lèi)對(duì)象上轉(zhuǎn)型為父類(lèi)對(duì)象時(shí),不論子類(lèi)中有沒(méi)有定義這個(gè)靜態(tài)方法,該對(duì)象都會(huì)使用父類(lèi)中的靜態(tài)方法。因此這里說(shuō)靜態(tài)方法可以被隱藏而不能被覆蓋。這與子類(lèi)隱藏父類(lèi)中的成員變量是一樣的。隱藏和覆蓋的區(qū)別在于,子類(lèi)對(duì)象轉(zhuǎn)換成父類(lèi)對(duì)象后,能夠訪(fǎng)問(wèn)父類(lèi)被隱藏的變量和方法,而不能訪(fǎng)問(wèn)父類(lèi)被覆蓋的方法)

      由上面我們可以得出結(jié)論,如果一個(gè)方法不可被繼承或者繼承后不可被覆蓋,那么這個(gè)方法就采用的靜態(tài)綁定。

      java的編譯與運(yùn)行
      java的編譯過(guò)程是將java源文件編譯成字節(jié)碼(jvm可執(zhí)行代碼,即.class文件)的過(guò)程,在這個(gè)過(guò)程中java是不與內(nèi)存打交道的,在這個(gè)過(guò)程中編譯器會(huì)進(jìn)行語(yǔ)法的分析,如果語(yǔ)法不正確就會(huì)報(bào)錯(cuò)。
      Java的運(yùn)行過(guò)程是指jvm(java虛擬機(jī))裝載字節(jié)碼文件并解釋執(zhí)行。在這個(gè)過(guò)程才是真正的創(chuàng)立內(nèi)存布局,執(zhí)行java程序。
      java字節(jié)碼的執(zhí)行有兩種方式: (1)即時(shí)編譯方式:解釋器先將字節(jié)編譯成機(jī)器碼,然后再執(zhí)行該機(jī)器碼;(2)解釋執(zhí)行方式:解釋器通過(guò)每次解釋并執(zhí)行一小段代碼來(lái)完成java字節(jié)碼程序的所有操作。(這里我們可以看出java程序在執(zhí)行過(guò)程中其實(shí)是進(jìn)行了兩次轉(zhuǎn)換,先轉(zhuǎn)成字節(jié)碼再轉(zhuǎn)換成機(jī)器碼。這也正是java能一次編譯,到處運(yùn)行的原因。在不同的平臺(tái)上裝上對(duì)應(yīng)的java虛擬機(jī),就可以實(shí)現(xiàn)相同的字節(jié)碼轉(zhuǎn)換成不同平臺(tái)上的機(jī)器碼,從而在不同的平臺(tái)上運(yùn)行)

      前面已經(jīng)說(shuō)了對(duì)于java當(dāng)中的方法而言,除了final,static,private
      和構(gòu)造方法是前期綁定外,其他的方法全部為動(dòng)態(tài)綁定。
      而動(dòng)態(tài)綁定的典型發(fā)生在父類(lèi)和子類(lèi)的轉(zhuǎn)換聲明之下:
      比如:Parent p = new Children();
      其具體過(guò)程細(xì)節(jié)如下:
      1:編譯器檢查對(duì)象的聲明類(lèi)型和方法名。
      假設(shè)我們調(diào)用x.f(args)方法,并且x已經(jīng)被聲明為C類(lèi)的對(duì)象,那么編譯器會(huì)列舉出C 類(lèi)中所有的名稱(chēng)為f 的方法和從C 類(lèi)的超類(lèi)繼承過(guò)來(lái)的f 方法。
      2:接下來(lái)編譯器檢查方法調(diào)用中提供的參數(shù)類(lèi)型。
      如果在所有名稱(chēng)為f 的方法中有一個(gè)參數(shù)類(lèi)型和調(diào)用提供的參數(shù)類(lèi)型最為匹配,那么就調(diào)用這個(gè)方法,這個(gè)過(guò)程叫做“重載解析”。

      3:當(dāng)程序運(yùn)行并且使用動(dòng)態(tài)綁定調(diào)用方法時(shí),虛擬機(jī)必須調(diào)用同x所指向的對(duì)象的實(shí)際類(lèi)型相匹配的方法版本。

      假設(shè)實(shí)際類(lèi)型為D(C的子類(lèi)),如果D類(lèi)定義了f(String)那么該方法被調(diào)用,否則就在D的超類(lèi)中搜尋方法f(String),依次類(lèi)推。

      JAVA 虛擬機(jī)調(diào)用一個(gè)類(lèi)方法時(shí)(靜態(tài)方法),它會(huì)基于對(duì)象引用的類(lèi)型(通常在編譯時(shí)可知)來(lái)選擇所調(diào)用的方法。相反,當(dāng)虛擬機(jī)調(diào)用一個(gè)實(shí)例方法時(shí),它會(huì)基于對(duì)象實(shí)際的類(lèi)型(只能在運(yùn)行時(shí)得知)來(lái)選擇所調(diào)用的方法,這就是動(dòng)態(tài)綁定,是多態(tài)的一種。動(dòng)態(tài)綁定為解決實(shí)際的業(yè)務(wù)問(wèn)題提供了很大的靈活性,是一種非常優(yōu)美的機(jī)制。

      與方法不同,在處理java類(lèi)中的成員變量(實(shí)例變量和類(lèi)變量)時(shí),并不是采用運(yùn)行時(shí)綁定,而是一般意義上的靜態(tài)綁定。所以在向上轉(zhuǎn)型的情況下,對(duì)象的方法可以找到子類(lèi),而對(duì)象的屬性(成員變量)還是父類(lèi)的屬性(子類(lèi)對(duì)父類(lèi)成員變量的隱藏)。
      Java代碼
      1. public class Father {  
      2.     protected String name = "父親屬性";  
      3. }  
      4.     
      5.   
      6. public class Son extends Father {  
      7.     protected String name = "兒子屬性";  
      8.   
      9.     public static void main(String[] args) {  
      10.         Father sample = new Son();  
      11.         System.out.println("調(diào)用的屬性:" + sample.name);  
      12.     }  
      13. }  

      結(jié)論,調(diào)用的成員為父親的屬性。
      這個(gè)結(jié)果表明,子類(lèi)的對(duì)象(由父類(lèi)的引用handle)調(diào)用到的是父類(lèi)的成員變量。所以必須明確,運(yùn)行時(shí)(動(dòng)態(tài))綁定針對(duì)的范疇只是對(duì)象的方法。
      現(xiàn)在試圖調(diào)用子類(lèi)的成員變量name,該怎么做?最簡(jiǎn)單的辦法是將該成員變量封裝成方法getter形式。
      代碼如下:
      Java代碼
      1. public class Father {  
      2.     protected String name = "父親屬性";  
      3.   
      4.     public String getName() {  
      5.         return name;  
      6.     }  
      7. }    
      8.   
      9. public class Son extends Father {  
      10.     protected String name = "兒子屬性";  
      11.   
      12.     public String getName() {  
      13.         return name;  
      14.     }  
      15.   
      16.     public static void main(String[] args) {  
      17.         Father sample = new Son();  
      18.         System.out.println("調(diào)用的屬性:" + sample.getName());  
      19.     }  
      20. }  

      結(jié)果:調(diào)用的是兒子的屬性
      java因?yàn)槭裁磳?duì)屬性要采取靜態(tài)的綁定方法。這是因?yàn)殪o態(tài)綁定是有很多的好處,它可以讓我們?cè)诰幾g期就發(fā)現(xiàn)程序中的錯(cuò)誤,而不是在運(yùn)行期。這樣就可以提高程序的運(yùn)行效率!而對(duì)方法采取動(dòng)態(tài)綁定是為了實(shí)現(xiàn)多態(tài),多態(tài)是java的一大特色。多態(tài)也是面向?qū)ο蟮年P(guān)鍵技術(shù)之一,所以java是以效率為代價(jià)來(lái)實(shí)現(xiàn)多態(tài)這是很值得的。

      注:以上內(nèi)容大部分來(lái)自互聯(lián)網(wǎng),小部分是個(gè)人見(jiàn)解,絕非權(quán)威性言論。如有語(yǔ)言表達(dá)不當(dāng)或者表述不正確的地方,萬(wàn)望指教。

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

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶(hù) 評(píng)論公約

        類(lèi)似文章 更多