在Java中,方法的調用分為靜態分派和動態分派。這兩種方式是通過參數的類型來區分的。下面我們分別來介紹一下靜態分派和動態分派。
靜態分派
public class StaticDispatch{ public void sayHello(Human human){ System.out.println("hello, human!"); } public void sayHello(Man man){ System.out.println("hello, man!"); } public void sayHello(Woman woman){ System.out.println("hello, woman!"); } public static void main(String[] args){ Human man = new Man(); Human woman = new Woman(); StaticDispatch sd = new StaticDispatch(); sd.sayHello(man); //hello, human! sd.sayHello(woman); //hello, human! } } class Human{} class Man extends Human{} class Woman extends Human{}
從上述代碼可以看出,靜態分派發生在編譯時期,它是根據參數的靜態類型來確定要調用的方法。當我們傳入的參數是Human類型的時候,Java編譯器會選擇調用sayHello(Human human)方法。即使我們在運行時傳入的是Man或者Woman類型的對象,Java編譯器也只會根據參數的靜態類型來判斷需要調用哪個方法。
動態分派
public class DynamicDispatch{ public void sayHello(Human human){ System.out.println("hello, human!"); } public void sayHello(Man man){ System.out.println("hello, man!"); } public void sayHello(Woman woman){ System.out.println("hello, woman!"); } public static void main(String[] args){ Human man = new Man(); Human woman = new Woman(); DynamicDispatch dd = new DynamicDispatch(); dd.sayHello(man); //hello, man! dd.sayHello(woman); //hello, woman! } } class Human{ public void sayHello(){ System.out.println("hello, human!"); } } class Man extends Human{ public void sayHello(){ System.out.println("hello, man!"); } } class Woman extends Human{ public void sayHello(){ System.out.println("hello, woman!"); } }
動態分派發生在運行時期,它是根據對象的實際類型來確定要調用的方法。在上述代碼中,我們在Human、Man和Woman類中都定義了sayHello()方法,當我們將Man和Woman對象向上轉型為Human類型時,它們所指向的方法就變成了sayHello()方法。這時候,Java虛擬機在實際調用sayHello()方法時,會根據對象的實際類型來選擇要調用哪一個類中的方法。
上一篇css表格上邊框下邊框