java動態綁定和靜態綁定用法實例詳解

這篇文章主要介紹了java動態綁定和靜態綁定用法,結合實例形式詳細分析了java動態綁定與靜態綁定相關概念、原理、實現方法及使用注意事項,需要的朋友可以參考下

本文實例講述了java動態綁定和靜態綁定用法。分享給大家供大家參考,具體如下:

背景

1.當子類和父類存在同一個方法,子類重寫了父類的方法,程序在運行時調用的是父類的方法還是子類的重寫方法呢(尤其是存在向上類型轉換的情況)?

2.當一個類中存在方法名相同但參數不同(重載)的方法,程序在執行的時候該如何辨別區分使用哪個方法呢?

在java中存在綁定的機制解決以上疑問。

綁定

綁定:將一個方法的調用與方法所在的類(方法主體)關聯起來。即決定調用哪個方法和變量。

在java中,綁定分爲靜態綁定和動態綁定。也叫作前期綁定和後期綁定。

靜態綁定

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

java當中的方法只有final、static、private修飾的的方法和構造方法是靜態綁定的。

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

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

static修飾的方法:可以被子類繼承,但是不能被子類重寫(覆蓋),但是可以被子類隱藏。(這裏意思是數哦如果父類裏有一個static方法,它的子類裏如果沒有對應的方法,那麼當子類對象調用這個方法時就會使用父類中的方法,而如果子類中定義了相同的方法,則會調用子類中定義的方法,唯一的不同就是:當子類對象向上類型轉換爲父類對象時,不論子類中有沒有定義這個靜態方法,該對象都會使用父類中的靜態方法,因此這裏說靜態方法可以被隱藏而不能被覆蓋。這與子類隱藏父類中的成員變量是一樣的。隱藏和覆蓋的區別在於,子類對象轉換成父類對象後,能夠訪問父類被隱藏的變量和方法,而不能訪問父類被覆蓋的方法)。

構造方法:構造方法也是不能被繼承的(因爲子類是通過super方法調用父類的構造函數,或者是jvm自動調用父類的默認構造方法),因此編譯時也可以知道這個構造方法方法到底是屬於哪個類的。

因此,一個方法被繼承,或者是被繼承後不能被覆蓋,那麼這個方法就採用靜態綁定

動態綁定

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

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

動態綁定的過程:

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

2.虛擬機搜索方法簽名

3.調用方法

java中重載的方法使用靜態綁定,重寫的方法使用動態綁定。

實驗

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構造函數");
 }
 
  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構造函數");
 }
 
 public static void print1() {
 System.out.println("child的print1");
  }
 
 public void print2() {
   System.out.println("child的print2");
  }
}

結果

parent構造函數
child構造函數
parent private string
child private string
parent的print
parent的print
child的print1
parent的print1
child的print2
child的print2

更多java相關內容感興趣的讀者可查看本站專題:《Java面向對象程序設計入門與進階教程》、《Java數據結構與算法教程》、《Java操作DOM節點技巧總結》、《Java文件與目錄操作技巧彙總》和《Java緩存操作技巧彙總

希望本文所述對大家java程序設計有所幫助。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章