Java 中靜態繫結和動態繫結的區別

Mohammad Irfan 2023年10月12日
  1. Java 中的靜態繫結
  2. Java 中的靜態繫結示例
  3. Java 中的動態繫結
  4. Java 中的動態繫結示例
  5. Java 中的靜態繫結和動態繫結
Java 中靜態繫結和動態繫結的區別

本教程介紹了 Java 中靜態繫結和動態繫結之間的區別,並列出了一些示例程式碼以指導你瞭解該主題。

繫結是將方法呼叫連結到方法實現,它有兩種型別:靜態和動態。根據多型性,一個物件可以有多種形式,這些形式可以在編譯時或執行時解析。

當方法呼叫在編譯時連結到方法實現時,就會發生靜態繫結。動態繫結在執行時發生時發生。讓我們詳細瞭解這兩種型別的繫結並檢視一些示例。

Java 中的靜態繫結

如上所述,靜態繫結是在編譯期間發生的繫結。它也被稱為早期繫結,因為它發生在編譯時本身。

在靜態繫結的情況下,編譯器確切地知道要使用該方法的哪個實現。它使用型別或類資訊進行繫結;方法過載是靜態繫結的一個例子。

請注意,所有靜態、最終和私有方法都使用靜態繫結,因為子類不能覆蓋靜態、最終和私有方法。編譯器在編譯時就知道要使用哪個方法實現。由於編譯器知道父類的方法不能被覆蓋,所以它總是使用該方法的父類實現。

此外,靜態繫結的效能也更好,因為涉及的開銷更少。

Java 中的靜態繫結示例

在下面的程式碼中,學校類有一個靜態的 ringBell() 方法,這個類是由 Classroom 擴充套件的。Classroom 也有一個 ringBell() 方法。

由於 ringBell() 方法是靜態的,編譯器只檢查類型別,不考慮分配的物件類。因此,當使用 School 類建立 Classroom(School s2 = new Classroom()) 的物件時,將考慮 School 類的實現,而不是 Classroom 類。

class School {
  public static void ringBell() {
    System.out.println("Ringing the school bell...");
  }
}
class Classroom extends School {
  public static void ringBell() {
    System.out.println("Ringing the classroom bell...");
  }
}
public class Main {
  public static void main(String[] args) {
    School s1 = new School(); // Type is School
    s1.ringBell();
    Classroom c1 = new Classroom(); // Type is Classroom
    c1.ringBell();
    School s2 = new Classroom(); // Type is School
    s2.ringBell();
  }
}

輸出:

Ringing the school bell...
Ringing the classroom bell...
Ringing the school bell...

Java 中的動態繫結

動態繫結在執行時解析繫結,因為編譯器不知道在編譯時使用哪個實現。

它也被稱為後期繫結,因為繫結是在執行時的後期而不是在編譯時解析的。動態繫結也使用物件而不是型別或類進行繫結;方法覆蓋是動態繫結的一個例子。

Java 中的動態繫結示例

在下面的程式碼中,ringBell() 方法不是靜態的,因此會發生覆蓋。編譯器不知道應該使用 ringBell() 方法的哪個實現,因此繫結是在執行時解析的。

在執行時,會考慮物件而不是用於建立它的型別。因此,當使用 School 類建立 Classroom 的物件時,將考慮 Classroom 類的實現,而不是 School 類。

class School {
  public void ringBell() {
    System.out.println("Ringing the school bell...");
  }
}
class Classroom extends School {
  @Override
  public void ringBell() {
    System.out.println("Ringing the classroom bell...");
  }
}
public class Main {
  public static void main(String[] args) {
    School s1 = new School(); // Type is School and object is of School
    s1.ringBell();
    Classroom c1 = new Classroom(); // Type is Classroom and object is of Classroom
    c1.ringBell();
    School s2 = new Classroom(); // Type is School and object is of Classroom
    s2.ringBell();
  }
}

輸出:

Ringing the school bell...
Ringing the classroom bell...
Ringing the classroom bell...

Java 中的靜態繫結和動態繫結

靜態繫結是在編譯時方法呼叫與方法實現的連線。另一方面,動態繫結是方法呼叫在執行時與方法實現的連線。

瞭解這兩種技術對於理解多型性的概念很重要。靜態繫結被靜態、最終和私有方法使用;這種繫結在方法過載的情況下生效。動態繫結用於虛擬方法(在 Java 中預設為虛擬)並用於繫結被覆蓋的方法。

相關文章 - Java Method