溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

如何在java中使用動態(tài)綁定和靜態(tài)綁定

發(fā)布時間:2021-05-10 17:27:43 來源:億速云 閱讀:140 作者:Leah 欄目:編程語言

如何在java中使用動態(tài)綁定和靜態(tài)綁定?相信很多沒有經(jīng)驗的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。

java基本數(shù)據(jù)類型有哪些

Java的基本數(shù)據(jù)類型分為:1、整數(shù)類型,用來表示整數(shù)的數(shù)據(jù)類型。2、浮點類型,用來表示小數(shù)的數(shù)據(jù)類型。3、字符類型,字符類型的關(guān)鍵字是“char”。4、布爾類型,是表示邏輯值的基本數(shù)據(jù)類型。

綁定

綁定:將一個方法的調(diào)用與方法所在的類(方法主體)關(guān)聯(lián)起來。即決定調(diào)用哪個方法和變量。

在java中,綁定分為靜態(tài)綁定和動態(tài)綁定。也叫作前期綁定和后期綁定。

靜態(tài)綁定

在程序執(zhí)行以前已經(jīng)被綁定(即在編譯過程中就已經(jīng)知道這個方法到底是哪個類中的方法)。

java當(dāng)中的方法只有final、static、private修飾的的方法和構(gòu)造方法是靜態(tài)綁定的。

private修飾的方法:private修飾的方法是不能被繼承的,因此子類無法訪問父類中private修飾的方法。所以只能通過父類對象來調(diào)用該方法體。因此可以說private方法和定義這個方法的類綁定在了一起。

final修飾的方法:可以被子類繼承,但是不能被子類重寫(覆蓋),所以在子類中調(diào)用的實際是父類中定義的final方法。(使用final修飾方法的兩個好處:(1)防止方法被覆蓋;(2)關(guān)閉java中的動態(tài)綁定)。

static修飾的方法:可以被子類繼承,但是不能被子類重寫(覆蓋),但是可以被子類隱藏。(這里意思是數(shù)哦如果父類里有一個static方法,它的子類里如果沒有對應(yīng)的方法,那么當(dāng)子類對象調(diào)用這個方法時就會使用父類中的方法,而如果子類中定義了相同的方法,則會調(diào)用子類中定義的方法,唯一的不同就是:當(dāng)子類對象向上類型轉(zhuǎn)換為父類對象時,不論子類中有沒有定義這個靜態(tài)方法,該對象都會使用父類中的靜態(tài)方法,因此這里說靜態(tài)方法可以被隱藏而不能被覆蓋。這與子類隱藏父類中的成員變量是一樣的。隱藏和覆蓋的區(qū)別在于,子類對象轉(zhuǎn)換成父類對象后,能夠訪問父類被隱藏的變量和方法,而不能訪問父類被覆蓋的方法)。

構(gòu)造方法:構(gòu)造方法也是不能被繼承的(因為子類是通過super方法調(diào)用父類的構(gòu)造函數(shù),或者是jvm自動調(diào)用父類的默認(rèn)構(gòu)造方法),因此編譯時也可以知道這個構(gòu)造方法方法到底是屬于哪個類的。

因此,一個方法被繼承,或者是被繼承后不能被覆蓋,那么這個方法就采用靜態(tài)綁定

動態(tài)綁定

在運行時期根據(jù)具體對象的類型進行綁定。

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

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

1.虛擬機提取對象實際類型的方法表

2.虛擬機搜索方法簽名

3.調(diào)用方法

java中重載的方法使用靜態(tài)綁定,重寫的方法使用動態(tài)綁定。

實驗

package practice;
public class Bind{
 public static void main(String[] args) {
 Child c = new Child();
 Parent p = c;
 
 System.out.println(p.getPristr());
 System.out.println(c.pristr);
 c.print();
 p.print();
 
 c.print1();
 p.print1();
 
 c.print2();
 p.print2();
 
 }
}
class Parent{
 private String pristr = "parent private string";
 String pubstr = "public string";
 
 public String getPristr() {
 return pristr;
 }
 public void setPristr(String pristr) {
 this.pristr = pristr;
 }
 public Parent() {
 System.out.println("parent構(gòu)造函數(shù)");
 }
 
  final public void print() {
   System.out.println("parent的print");
  }
  public static void print1() {
   System.out.println("parent的print1");
  }
  public void print2() {
   System.out.println("parent的print2");
  }
}
class Child extends Parent{
 String pristr = "child private string";
 String pubstr = "public string";
 
 public Child() {
 System.out.println("child構(gòu)造函數(shù)");
 }
 
 public static void print1() {
 System.out.println("child的print1");
  }
 
 public void print2() {
   System.out.println("child的print2");
  }
}

結(jié)果

parent構(gòu)造函數(shù)
child構(gòu)造函數(shù)
parent private string
child private string
parent的print
parent的print
child的print1
parent的print1
child的print2
child的print2

看完上述內(nèi)容,你們掌握如何在java中使用動態(tài)綁定和靜態(tài)綁定的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI