一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|編程技術|正則表達式|

服務器之家 - 編程語言 - JAVA教程 - Java 靜態(tài)綁定與動態(tài)綁定深入分析

Java 靜態(tài)綁定與動態(tài)綁定深入分析

2020-07-06 14:44zhangjk1993 JAVA教程

這篇文章主要介紹了Java 靜態(tài)綁定與動態(tài)綁定深入分析的相關資料,這里對java 的動態(tài)綁定和靜態(tài)綁定做了詳細的介紹,對其進行總結整理,需要的朋友可以參考下

Java 靜態(tài)綁定動態(tài)綁定

          最近學習java 的知識,對java的靜態(tài)綁定和動態(tài)綁定的學習很是模糊不清,然后就百度一下對其相應的知識進行了總結整理,幫助掌握這部分的知識

程序綁定的概念:

綁定指的是一個方法的調用與方法所在的類(方法主體)關聯(lián)起來。對java來說,綁定分為靜態(tài)綁定和動態(tài)綁定;或者叫做前期綁定和后期綁定.

靜態(tài)綁定:

在程序執(zhí)行前方法已經被綁定(也就是說在編譯過程中就已經知道這個方法到底是哪個類中的方法),此時由編譯器或其它連接程序實現(xiàn)。例如:C。

針對java簡單的可以理解為程序編譯期的綁定;這里特別說明一點,java當中的方法只有final,static,private和構造方法是前期綁定

動態(tài)綁定:

后期綁定:在運行時根據具體對象的類型進行綁定。

若一種語言實現(xiàn)了后期綁定,同時必須提供一些機制,可在運行期間判斷對象的類型,并分別調用適當的方法。也就是說,編譯器此時依然不知道對象的類型,但方法調用機制能自己去調查,找到正確的方法主體。不同的語言對后期綁定的實現(xiàn)方法是有所區(qū)別的。但我們至少可以這樣認為:它們都要在對象中安插某些特殊類型的信息。

動態(tài)綁定的過程:

  1. 虛擬機提取對象的實際類型的方法表;
  2. 虛擬機搜索方法簽名
  3. 調用方法。

關于final,static,private和構造方法是前期綁定的理解

對于private的方法,首先一點它不能被繼承,既然不能被繼承那么就沒辦法通過它子類的對象來調用,而只能通過這個類自身的對象來調用。因此就可以說private方法和定義這個方法的類綁定在了一起。

final方法雖然可以被繼承,但不能被重寫(覆蓋),雖然子類對象可以調用,但是調用的都是父類中所定義的那個final方法,(由此我們可以知道將方法聲明為final類型,一是為了防止方法被覆蓋,二是為了有效地關閉java中的動態(tài)綁定)。
構造方法也是不能被繼承的(網上也有說子類無條件地繼承父類的無參數構造函數作為自己的構造函數,不過個人認為這個說法不太恰當,因為我們知道子類是通過super()來調用父類的無參構造方法,來完成對父類的初始化, 而我們使用從父類繼承過來的方法是不用這樣做的,因此不應該說子類繼承了父類的構造方法),因此編譯時也可以知道這個構造方法到底是屬于哪個類。

對于static方法,具體的原理我也說不太清。不過根據網上的資料和我自己做的實驗可以得出結論:static方法可以被子類繼承,但是不能被子類重寫(覆蓋),但是可以被子類隱藏。(這里意思是說如果父類里有一個static方法,它的子類里如果沒有對應的方法,那么當子類對象調用這個方法時就會使用父類中的方法。而如果子類中定義了相同的方法,則會調用子類的中定義的方法。唯一的不同就是,當子類對象上轉型為父類對象時,不論子類中有沒有定義這個靜態(tài)方法,該對象都會使用父類中的靜態(tài)方法。因此這里說靜態(tài)方法可以被隱藏而不能被覆蓋。這與子類隱藏父類中的成員變量是一樣的。隱藏和覆蓋的區(qū)別在于,子類對象轉換成父類對象后,能夠訪問父類被隱藏的變量和方法,而不能訪問父類被覆蓋的方法)

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

java的編譯與運行

java的編譯過程是將java源文件編譯成字節(jié)碼(jvm可執(zhí)行代碼,即.class文件)的過程,在這個過程中java是不與內存打交道的,在這個過程中編譯器會進行語法的分析,如果語法不正確就會報錯。

Java的運行過程是指jvm(java虛擬機)裝載字節(jié)碼文件并解釋執(zhí)行。在這個過程才是真正的創(chuàng)立內存布局,執(zhí)行java程序。
java字節(jié)碼的執(zhí)行有兩種方式: (1)即時編譯方式:解釋器先將字節(jié)編譯成機器碼,然后再執(zhí)行該機器碼;(2)解釋執(zhí)行方式:解釋器通過每次解釋并執(zhí)行一小段代碼來完成java字節(jié)碼程序的所有操作。(這里我們可以看出java程序在執(zhí)行過程中其實是進行了兩次轉換,先轉成字節(jié)碼再轉換成機器碼。這也正是java能一次編譯,到處運行的原因。在不同的平臺上裝上對應的java虛擬機,就可以實現(xiàn)相同的字節(jié)碼轉換成不同平臺上的機器碼,從而在不同的平臺上運行)

前面已經說了對于java當中的方法而言,除了final,static,private和構造方法是前期綁定外,其他的方法全部為動態(tài)綁定。
而動態(tài)綁定的典型發(fā)生在父類和子類的轉換聲明之下:

比如:Parent p = new Children();

其具體過程細節(jié)如下:

1:編譯器檢查對象的聲明類型和方法名。

假設我們調用x.f(args)方法,并且x已經被聲明為C類的對象,那么編譯器會列舉出C 類中所有的名稱為f 的方法和從C 類的超類繼承過來的f 方法。

2:接下來編譯器檢查方法調用中提供的參數類型。

如果在所有名稱為f 的方法中有一個參數類型和調用提供的參數類型最為匹配,那么就調用這個方法,這個過程叫做“重載解析”。

3:當程序運行并且使用動態(tài)綁定調用方法時,虛擬機必須調用同x所指向的對象的實際類型相匹配的方法版本。

假設實際類型為D(C的子類),如果D類定義了f(String)那么該方法被調用,否則就在D的超類中搜尋方法f(String),依次類推。
JAVA 虛擬機調用一個類方法時(靜態(tài)方法),它會基于對象引用的類型(通常在編譯時可知)來選擇所調用的方法。相反,當虛擬機調用一個實例方法時,它會基于對象實際的類型(只能在運行時得知)來選擇所調用的方法,這就是動態(tài)綁定,是多態(tài)的一種。動態(tài)綁定為解決實際的業(yè)務問題提供了很大的靈活性,是一種非常優(yōu)美的機制。

與方法不同,在處理java類中的成員變量(實例變量和類變量)時,并不是采用運行時綁定,而是一般意義上的靜態(tài)綁定。所以在向上轉型的情況下,對象的方法可以找到子類,而對象的屬性(成員變量)還是父類的屬性(子類對父類成員變量的隱藏)。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
public class Father {
  protected String name = "父親屬性";
}
  
 
public class Son extends Father {
  protected String name = "兒子屬性";
 
  public static void main(String[] args) {
    Father sample = new Son();
    System.out.println("調用的屬性:" + sample.name);
  }
}

結論,調用的成員為父親的屬性。

這個結果表明,子類的對象(由父類的引用handle)調用到的是父類的成員變量。所以必須明確,運行時(動態(tài))綁定針對的范疇只是對象的方法。

現(xiàn)在試圖調用子類的成員變量name,該怎么做?最簡單的辦法是將該成員變量封裝成方法getter形式。
代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class Father {
  protected String name = "父親屬性";
 
  public String getName() {
    return name;
  }
}  
 
public class Son extends Father {
  protected String name = "兒子屬性";
 
  public String getName() {
    return name;
  }
 
  public static void main(String[] args) {
    Father sample = new Son();
    System.out.println("調用的屬性:" + sample.getName());
  }
}

結果:調用的是兒子的屬性

java因為什么對屬性要采取靜態(tài)的綁定方法。這是因為靜態(tài)綁定是有很多的好處,它可以讓我們在編譯期就發(fā)現(xiàn)程序中的錯誤,而不是在運行期。這樣就可以提高程序的運行效率!而對方法采取動態(tài)綁定是為了實現(xiàn)多態(tài),多態(tài)是java的一大特色。多態(tài)也是面向對象的關鍵技術之一,所以java是以效率為代價來實現(xiàn)多態(tài)這是很值得的。

注:以上內容大部分來自互聯(lián)網,小部分是個人見解,絕非權威性言論。如有語言表達不當或者表述不正確的地方,萬望指教。

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

原文鏈接:http://blog.csdn.net/zhangjk1993/article/details/24066085

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 精品亚洲欧美中文字幕在线看 | 国产一级持黄大片99久久 | 欧美国产日产精品免费视频 | 国产精品久久亚洲一区二区 | 乌克兰一级片 | 吃瓜视频在线观看 | 网站在线观看 | 日韩一区二区三区免费 | 日出水了特别黄的视频 | 欧美a一级片| 天堂中文在线观看 | 草莓视频旧版本 | 亚洲成色WWW久久网站夜月 | 顶级欧美做受xxx000大乳 | 欧美黑人成人免费全部 | 天码毛片一区二区三区入口 | 韩国三级在线观看 完整版 韩国三级视频网站 | 国产精品视频人人做人人爱 | 欧美一级激情 | 3d美女触手怪爆羞羞漫画 | 色卡7707c| 福利国模私拍视频在线观看 | 国产成人理在线观看视频 | 国产无限 | 国产拍拍拍免费专区在线观看 | 午夜理伦片免费 | 日本春菜花在线中文字幕 | 88av视频在线观看 | 高清一区| 女教师三级做受 | 精品午夜寂寞黄网站在线 | 日韩精品中文字幕久久 | 欧美成人中文字幕在线看 | 精品精品国产自在久久高清 | 国产成人手机在线 | 99久久99久久久精品齐齐鬼色 | 国产情侣啪啪 | 成人精品视频 成人影院 | 国产人人艹 | 免费看片aⅴ免费大片 | 午夜伦伦电影理论片大片 |