在 Java 中,靜態(tài)分派和動(dòng)態(tài)分配是兩種不同的方法調(diào)用方式。
靜態(tài)分派又稱為編譯期分派,是指在編譯階段根據(jù)方法參數(shù)的靜態(tài)類型決定使用哪個(gè)方法。靜態(tài)類型是指在聲明變量時(shí)所使用的類型。例如:
public class Test { public static void main(String[] args) { Animal animal = new Animal(); print(animal); Dog dog = new Dog(); print(dog); Cat cat = new Cat(); print(cat); } public static void print(Animal animal) { System.out.println("動(dòng)物"); } public static void print(Dog dog) { System.out.println("狗"); } public static void print(Cat cat) { System.out.println("貓"); } } class Animal {} class Dog extends Animal {} class Cat extends Animal {}
由上述代碼可知,print 方法有三個(gè)重載版本,分別接收 Animal、Dog 和 Cat 類型的參數(shù)。在 main 方法中,我們分別創(chuàng)建了一個(gè) Animal、Dog 和 Cat 對(duì)象,并調(diào)用了 print 方法。由于 print 方法的參數(shù)是通過(guò)向上轉(zhuǎn)型轉(zhuǎn)換為 Animal 類型的,因此在編譯階段編譯器會(huì)根據(jù)其靜態(tài)類型決定使用哪個(gè)方法。因?yàn)?Animal、Dog 和 Cat 類型分別是 Animal 類型的子類,因此靜態(tài)類型都是 Animal,所以編譯器在編譯階段會(huì)選擇并聲明使用 print(Animal animal) 方法。
動(dòng)態(tài)分配又稱為運(yùn)行期分派,是指在運(yùn)行階段根據(jù)方法參數(shù)的實(shí)際類型決定使用哪個(gè)方法。實(shí)際類型是指在運(yùn)行時(shí)所引用的對(duì)象的類型。例如:
public class Test { public static void main(String[] args) { Animal animal = new Dog(); animal.eat(); animal = new Cat(); animal.eat(); } } class Animal { public void eat() { System.out.println("動(dòng)物在吃東西"); } } class Dog extends Animal { public void eat() { System.out.println("狗在吃肉"); } } class Cat extends Animal { public void eat() { System.out.println("貓?jiān)诔贼~(yú)"); } }
由上述代碼可知,在 main 方法中分別創(chuàng)建了一個(gè) Dog 和 Cat 對(duì)象并用 Animal 類型的 animal 引用變量引用,然后調(diào)用了相應(yīng)的 eat() 方法。在編譯階段,animal 的靜態(tài)類型是 Animal,因此編譯器只能判斷出 Animal 類型有一個(gè) eat() 方法。而在運(yùn)行階段,animal 引用的實(shí)際類型是運(yùn)行時(shí)所創(chuàng)建的對(duì)象的類型,這時(shí)會(huì)根據(jù)實(shí)際類型來(lái)選擇使用哪個(gè) eat() 方法。例如當(dāng) animal 引用的對(duì)象是 Dog 時(shí),因?yàn)?dog 的實(shí)際類型為 Dog,因此運(yùn)行時(shí)會(huì)選擇并調(diào)用 Dog 類中的 eat() 方法。