Java 中的早期繫結和後期繫結區別


在面向物件程式設計中,繫結指的是將方法呼叫與其實現關聯起來的方式。Java 作為一種面向物件程式語言,支援早期繫結和後期繫結,也分別稱為靜態繫結和動態繫結。兩種繫結方式都有各自的優點和應用場景。本文將探討 Java 中早期繫結和後期繫結的語法、解釋以及它們之間的區別。

語法

Java 中早期繫結的語法如下所示。

<ClassName> <objectName> = new <ClassName>();

Java 中後期繫結的語法如下所示。

<ClassName> <objectName> = new <DerivedClassName>();

語法解釋

在早期繫結中,類的型別是在編譯時確定的,方法的實現根據物件宣告的型別來選擇。這意味著編譯器知道物件的具體類,並且可以將方法呼叫直接繫結到方法的實現。

另一方面,後期繫結是在執行時確定類的型別,並根據物件的實際型別來選擇方法的實現。這意味著編譯器不知道物件的具體類,必須依賴執行時環境來查詢正確的方法實現。

方法 1:早期繫結

在早期繫結中,方法呼叫在編譯時解析。讓我們考慮以下早期繫結的演算法:

  • 宣告一個名為 Shape 的類,其中包含一個名為 draw() 的方法。

  • 建立一個名為 Circle 的子類,繼承 Shape 類。

  • 在 Circle 類中實現 draw() 方法。

  • 使用早期繫結建立 Circle 類的物件。

  • 呼叫物件上的 draw() 方法。

示例

class Shape {
   public void draw() {
      System.out.println("Drawing a shape");
   }
}

class Circle extends Shape {
   @Override
   public void draw() {
      System.out.println("Drawing a circle");
   }
}

public class Main {
   public static void main(String[] args) {
      Shape shape = new Circle();
      shape.draw();
   }
}

輸出

Drawing a circle

方法 1 中程式碼的解釋

在此程式碼中,我們有一個 Shape 類,它有一個 draw() 方法,列印 "Drawing a shape"。我們還有一個 Circle 類,它繼承 Shape 類並覆蓋 draw() 方法以列印 "Drawing a circle"。在 Main 類中,我們透過將其宣告為 Shape 型別,使用早期繫結建立 Circle 類的物件。當我們呼叫 shape 物件的 draw() 方法時,輸出將為 "Drawing a circle"。這是因為方法呼叫在編譯時繫結到 Circle 類的實現。

方法 2:後期繫結

在後期繫結中,方法呼叫在執行時解析。讓我們考慮以下後期繫結的演算法:

  • 宣告一個名為 Animal 的類,其中包含一個名為 makeSound() 的方法。

  • 建立兩個名為 Dog 和 Cat 的子類,繼承 Animal 類。

  • 在 Dog 和 Cat 類中都實現 makeSound() 方法。

  • 使用後期繫結建立 Dog 類的物件。

  • 呼叫物件上的 makeSound() 方法。

示例

class Animal {
   public void makeSound() {
      System.out.println("Animal makes a sound");
   }
}

class Dog extends Animal {
   @Override
   public void makeSound() {
      System.out.println("Dog barks");
   }
}

class Cat extends Animal {
   @Override
   public void makeSound() {
      System.out.println("Cat meows");
   }
}

public class Main {
   public static void main(String[] args) {
      Animal animal = new Dog();
      animal.makeSound();
   }
}

輸出

Dog barks

方法 2 中程式碼的解釋

在此程式碼中,我們有一個 Animal 類,它有一個 makeSound() 方法,列印 "Animal makes a sound"。我們還有兩個子類 Dog 和 Cat,它們繼承 Animal 類並覆蓋 makeSound() 方法,分別列印 "Dog barks" 和 "Cat meows"。在 Main 類中,我們透過將其宣告為 Animal 型別,使用後期繫結建立 Dog 類的物件。當我們呼叫 animal 物件的 makeSound() 方法時,輸出將為 "Dog barks"。這是因為方法呼叫在執行時根據物件的實際型別繫結到 Dog 類的實現。

Java 中的早期繫結和後期繫結區別

區別

早期繫結

後期繫結

解析時間

編譯時

執行時

方法實現

根據物件的宣告型別確定

根據物件的實際型別確定

靈活性

動態更改方法實現的靈活性有限

透過動態方法分派和多型性提供靈活性

效能

由於方法呼叫在編譯時解析,因此效能更快

由於方法呼叫在執行時解析,因此效能略慢

物件宣告

物件宣告使用類型別

物件宣告使用派生類型別

結論

早期繫結和後期繫結是 Java 中兩個重要的概念,它們決定了方法呼叫的解析方式。早期繫結在編譯時將方法呼叫與其實現關聯起來,而後期繫結在執行時根據物件的實際型別解析方法呼叫。每種方法都有一套獨特的優點和應用場景。雖然早期繫結由於方法呼叫在編譯時解析而提供更好的效能,但它不允許動態更改方法實現。另一方面,後期繫結允許動態方法分派,從而實現多型性和方法呼叫的靈活性。理解早期繫結和後期繫結之間的區別對於編寫高效且靈活的 Java 程式至關重要。

更新於: 2023年7月28日

2K+ 閱讀量

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告

© . All rights reserved.