天天看點

深入了解Java中靜态綁定與動态綁定的差別

作者:天之藍3385

為了了解 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 中的靜态和動态綁定的概念,讓我們看看你是否能回答這個問題:

深入了解Java中靜态綁定與動态綁定的差別

讓我們知道這個程式将列印什麼?它是否會列印 Collection、Set 或 HashSet?

這就是Java 中早期(靜态)和晚期(動态)綁定之間的差別。這是最好的 Java 電話面試問題之一,因為它提供了幾個測試候選人 Java 知識深度的機會。永遠記住,私有、靜态和最終方法是使用靜态綁定綁定的,而虛拟方法是使用動态綁定綁定的。

同樣,方法重載是靜态綁定的最佳示例,方法覆寫是動态綁定的示例。

繼續閱讀