要了解Java 中
早期(靜態)綁定和
晚期(動態)綁定 之間的區別,您必須先了解什麼是
綁定。連結意味著連結和程式碼之間存在聯繫。例如,您引用的變數綁定到定義它的程式碼。同樣,被呼叫的方法也綁定到程式碼中定義它的位置。
Java 語言中的方法綁定有兩種類型:早期綁定(也稱為靜態)和晚期
綁定(分別稱為動態) 。在Java中呼叫方法意味著該方法綁定到特定的程式碼,無論是在編譯時還是在運行時,當程式運行並建立物件時。顧名思義,靜態連結本質上更靜態,因為它發生在編譯時,這意味著程式碼在將 Java 原始碼編譯成類別檔案後「知道」要呼叫哪個方法。由於這是指程式生命週期的早期階段,因此也稱為早期綁定。另一方面,動態連結發生在運行時,即程式由 Java 虛擬機器運行之後。在這種情況下,呼叫哪個方法是由具體物件決定的,因此該資訊在編譯時不可用,因為物件是在執行時建立的。由於這種情況發生在程式生命週期的後期,因此在 Java 中稱為後期綁定。
因此,Java 中靜態綁定和動態綁定之間的根本差異在於,前者根據引用變數的類型在編譯時早期發生,而後者在執行時使用具體物件發生較晚。 |
讓我們看看更多的差異,以便更好地理解這一點,並能夠回答 Java 面試中提出的這個非常流行的問題。
Java 中的早期和晚期綁定
Java 中的靜態綁定和動態綁定有很多區別,但最重要的是 JVM 如何使用它們。您是否想知道當作用域內存在多個同名方法時,JVM 如何決定呼叫哪個方法?如果您曾經使用過方法重載或重寫,您就會知道在 Java 中可以有多個同名的方法。對於 Java,JVM 使用靜態和動態綁定來選擇所需的方法。
Java中靜態和動態綁定的範例
在此程式中,您將看到使用靜態綁定在編譯時不會發生虛擬方法的綁定,因為這會呼叫超類別中的方法,就像早期綁定的靜態方法一樣。如果呼叫子類別中的方法,則在執行時間使用特定物件來綁定函數,因此使用動態綁定來綁定虛函數。
public class Main {
public static void main(String[] args) {
Insurance current = new CarInsurance();
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 語言中使用動態綁定來解析方法重寫。
- 同樣,私有、靜態和終端方法使用靜態綁定來解析,因為它們不能被重寫,而所有虛擬方法都使用動態綁定來解析。
- 在靜態綁定的情況下,使用的不是具體對象,而是類型信息,即引用變數的類型,用於發現所需的方法。另一方面,動態綁定使用特定的物件來尋找 Java 中所需的方法。
這是一個基於 Java 中靜態和動態綁定概念的很好的練習。你能回答這個問題:
“執行下面的程式會輸出什麼?”
這個程式會輸出什麼?Collection
,Set
或者HashSet
? 這就是我們想要告訴您的有關Java 中
早期(靜態)和
晚期(動態)綁定之間的差異的全部內容。這是最好的 Java 電話面試問題之一,因為它提供了許多測試候選人知識深度的機會。永遠記住,
私人、
靜態和
最終方法是使用靜態連結綁定的,而
虛擬方法是使用動態連結綁定的。同樣,靜態綁定的最佳範例是方法重載,而重寫是動態的。
來源
GO TO FULL VERSION