JavaRush /Java Blog /Random-TW /Java 中早期綁定和後期綁定的區別

Java 中早期綁定和後期綁定的區別

在 Random-TW 群組發布
要了解Java 中早期(靜態)綁定和晚期(動態)綁定 之間的區別,您必須先了解什麼是綁定。連結意味著連結和程式碼之間存在聯繫。例如,您引用的變數綁定到定義它的程式碼。同樣,被呼叫的方法也綁定到程式碼中定義它的位置。
Java 中早期綁定和後期綁定的差異 - 1
Java 語言中的方法綁定有兩種類型:早期綁定(也稱為靜態)和晚期綁定(分別稱為動態) 。在Java中呼叫方法意味著該方法綁定到特定的程式碼,無論是在編譯時還是在運行時,當程式運行並建立物件時。顧名思義,靜態連結本質上更靜態,因為它發生在編譯時,這意味著程式碼在將 Java 原始碼編譯成類別檔案後「知道」要呼叫哪個方法。由於這是指程式生命週期的早期階段,因此也稱為早期綁定。另一方面,動態連結發生在運行時,即程式由 Java 虛擬機器運行之後。在這種情況下,呼叫哪個方法是由具體物件決定的,因此該資訊在編譯時不可用,因為物件是在執行時建立的。由於這種情況發生在程式生命週期的後期,因此在 Java 中稱為後期綁定。
因此,Java 中靜態綁定和動態綁定之間的根本差異在於,前者根據引用變數的類型在編譯時早期發生,而後者在執行時使用具體物件發生較晚。
讓我們看看更多的差異,以便更好地理解這一點,並能夠回答 Java 面試中提出的這個非常流行的問題。

Java 中的早期和晚期綁定

Java 中的靜態綁定和動態綁定有很多區別,但最重要的是 JVM 如何使用它們。您是否想知道當作用域內存在多個同名方法時,JVM 如何決定呼叫哪個方法?如果您曾經使用過方法重載或重寫,您就會知道在 Java 中可以有多個同名的方法。對於 Java,JVM 使用靜態和動態綁定來選擇所需的方法。

Java中靜態和動態綁定的範例

在此程式中,您將看到使用靜態綁定在編譯時不會發生虛擬方法的綁定,因為這會呼叫超類別中的方法,就像早期綁定的靜態方法一樣。如果呼叫子類別中的方法,則在執行時間使用特定物件來綁定函數,因此使用動態綁定來綁定虛函數。
public class Main {
  public static void main(String[] args) {

    // Пример статического и динамического связывания в Java
    Insurance current = new CarInsurance();

    // Динамическое связывание на основе an object
    int premium = current.premium();

    // Статическое связывание на основе класса
    String category = current.category();

    System.out.println("premium : " + premium);
    System.out.println("category : " + category);
  }
}

class Insurance{
  public static final int LOW = 100;

  public int premium(){
    return LOW;
  }

  public static String category(){
    return "Insurance";
  }

}

class CarInsurance extends Insurance{
  public static final int HIGH = 200;

  public int premium(){
    return HIGH;
  }

  public static String category(){
    return "Car Insurance";
  }

}
Результаты выполнения:

premium : 200
category : Insurance
正如您所看到的,方法呼叫premium()導致子類別方法的執行,而方法呼叫category()導致超類別方法的執行。這是因為premium()- 是一個虛擬方法,它是使用後期綁定來解析的,而category()- 是一個靜態方法,它是使用類別名稱的編譯時靜態綁定來解析的。
有興趣閱讀有關 Java 的內容嗎?加入Java 開發者小組!

Java 中早期綁定和後期綁定的區別

現在您已經掌握了竅門並了解 Java 如何綁定方法呼叫以及靜態和動態綁定如何運作,讓我們回顧一下 Java 中早期綁定和後期綁定之間的主要差異:
  1. 靜態連結發生在編譯時,而動態連結發生在執行時。

  2. 由於靜態連結發生在程式生命週期的早期,因此稱為早期綁定。同樣,動態綁定也稱為後期綁定,因為它發生在程式執行的後期。

  3. Java 語言中使用靜態綁定來解析重載方法,而 Java 語言中使用動態綁定來解析方法重寫。

  4. 同樣,私有、靜態和終端方法使用靜態綁定來解析,因為它們不能被重寫,而所有虛擬方法都使用動態綁定來解析。

  5. 在靜態綁定的情況下,使用的不是具體對象,而是類型信息,即引用變數的類型,用於發現所需的方法。另一方面,動態綁定使用特定的物件來尋找 Java 中所需的方法。
這是一個基於 Java 中靜態和動態綁定概念的很好的練習。你能回答這個問題: “執行下面的程式會輸出什麼?”
Java 中早期綁定和後期綁定的差異 - 2
這個程式會輸出什麼?CollectionSet或者HashSet 這就是我們想要告訴您的有關Java 中早期(靜態)晚期(動態)綁定之間的差異的全部內容。這是最好的 Java 電話面試問題之一,因為它提供了許多測試候選人知識深度的機會。永遠記住,私人靜態最終方法是使用靜態連結綁定的,而虛擬方法是使用動態連結綁定的。同樣,靜態綁定的最佳範例是方法重載,而重寫是動態的。 來源
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION