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 中預設為虛擬)並用於繫結被覆蓋的方法。