為了了解 Java 中靜态綁定和動态綁定的差別,首先要了解什麼是綁定?綁定意味着引用和實際代碼之間的連結,例如,當您引用一個變量時,它會綁定到定義它的代碼,類似地,當您調用方法時,它會連結到定義方法的代碼。Java中有兩種方法綁定,靜态綁定和動态綁定。當在 Java 中調用方法時,它會在編譯時或運作時綁定到實際代碼,此時程式實際啟動并建立對象。
顧名思義,靜态綁定更多的是靜态性質,是以它發生在編譯時,即一旦您将 Java 源檔案編譯成類檔案,您的代碼就知道要調用哪個方法。由于它發生在程式生命周期的早期,它在 Java中也稱為早期綁定。
另一方面,動态綁定發生在運作時,即 JVM 啟動程式時。這次調用哪個方法是由一個實際的對象決定的,因為對象是在運作時建立的,是以在編譯時是不可用的。由于它發生在程式生命周期的後期,是以在 Java中也稱為後期綁定。
是以,這是 Java 中靜态綁定與動态綁定之間的根本差別,一種在編譯時早期使用引用變量的類型發生,而另一種在運作時後期使用實際對象發生。讓我們看看更多不同之處以更好地了解這個概念。這也是Java 的常見問題之一,尤其是在前幾輪中,是以在這裡花時間絕對是值得的。
靜态與動态綁定 Java
您可以在很多方面區分靜态綁定和動态綁定,但最重要的是 JVM 如何使用它。你有沒有想過如果作用域中有多個同名方法,JVM 是如何決定調用哪些方法的?
如果您曾經使用過方法重載或方法覆寫,那麼您就會知道在 Java 中可以有多個同名的方法。JVM 使用靜态和動态綁定在 Java 中找到正确的方法。
Java中的靜态和綁定示例
public class Main {
public static void main(String[] args) {
// An example of static and dynamic binding in Java
Insurance current = new CarInsurance();
// dynamic binding based upon object
int premium = current.premium();
// static binding based upon class
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";
}
}
Output
premium : 200
category : Insurance
在這個程式中,您将看到虛拟方法在編譯時沒有使用靜态綁定,因為如果發生這種情況,那麼超類中的方法将被調用,就像早期綁定的靜态方法一樣。由于調用了子類中的方法,證明實際對象在運作時用于函數綁定,是以動态綁定用于綁定虛方法。
您可以在這裡看到對premium()方法的調用從子類執行該方法,而對category()方法的調用從超類執行。發生這種情況是因為premium()是一個虛拟方法,并且使用後期綁定來解決,而category()是一個靜态方法,并且在編譯時使用類名使用靜态綁定來解決。
Java中早期綁定和後期綁定的差別
現在您已經了解并了解 Java 中方法調用是如何綁定的以及靜态和動态綁定是如何工作的,讓我們修改一下 Java 中靜态和動态綁定之間的一些重要的關鍵差別:
1) 靜态綁定發生在編譯時,而動态綁定發生在運作。
2)由于靜态綁定發生在程式生命周期的早期階段,是以也稱為早期綁定。同樣,動态綁定也稱為後期綁定,因為它發生在程式實際運作的後期。
3)靜态綁定用于解析Java中的重載方法,而動态綁定用于解析Java中的重寫方法。
4) 類似地,私有、靜态和最終方法是通過靜态綁定來解決的,因為它們不能被覆寫,并且所有虛拟方法都使用動态綁定來解決。
5) 在靜态綁定的情況下不使用實際對象,而是使用類型資訊,即引用變量的類型來定位方法。另一方面,動态綁定使用實際對象在 Java 中找到正确的方法。
這是一個很好的練習,它基于 Java 中的靜态和動态綁定的概念,讓我們看看你是否能回答這個問題:
讓我們知道這個程式将列印什麼?它是否會列印 Collection、Set 或 HashSet?
這就是Java 中早期(靜态)和晚期(動态)綁定之間的差別。這是最好的 Java 電話面試問題之一,因為它提供了幾個測試候選人 Java 知識深度的機會。永遠記住,私有、靜态和最終方法是使用靜态綁定綁定的,而虛拟方法是使用動态綁定綁定的。
同樣,方法重載是靜态綁定的最佳示例,方法覆寫是動态綁定的示例。