1.靜態分派就是按引數的靜態型別而不是實際型別定位方法呼叫版本的過程,發生在編譯期間。
過載的本質就是靜態分派,在編譯期間根據引數的靜態型別決定要呼叫的方法。
/**
* 過載demo
*/public class staticdispatch
static class man extends human{}
static class woman extends human{}
public void sayhello(human guy)
public void sayhello(man guy)
public void sayhello(woman guy)
public static void main(string args)
}
2.動態分派就是在執行過程中按實際型別定位方法版本的過程。
重寫的本質就是動態分派。
重寫設計到jvm的invokevirtual指令,該指令的解析過程如下:
1.找到運算元棧頂的第乙個元素所指向的實際型別,記為c;
2.如果在型別c中找到了與常量描述符和簡單名稱都相符的方法,則進行訪問許可權的校驗,如果通過則返回這個方法的直接引用,查詢結束。否則返回非法訪問異常。
3.如果型別c中沒有找到,則按照繼承關係從下到上一次對c的父類做第2步的搜尋和校驗過程。
4.如果始終沒有找到合適的方法,則丟擲抽象反覆錯誤的異常
從這個過程中可以發現,在第1步的時候就在執行期確定接收物件的實際型別,所以當呼叫invokevirtual指令就會把執行時常量池中的符號引用解析為不同的直接飲用,這就是重寫方法的本質。
/*
* 重寫demo
*/public class main
static class man extends human
}static class woman extends human
}public static void main(string args)
}
動態分派與靜態分派
包括靜態分派和動態分配。靜態分派 所有依賴今天型別來定位方法執行版本的分派稱為靜態分派,發生那邊應階段典型應用為方法過載靜態分派發生在編譯階段,因此靜態分派的動作實際上並不是虛擬機器來完成的。動態分派 典型應用為重寫,是一種動態的概念。向上轉型後呼叫子類覆寫的方法便是乙個很好的說明動態分配的例子。很...
靜態分派和動態分派
靜態分派 所有依賴靜態型別來定位方法執行版本的分派成為靜態分派,發生在編譯時期,典型 應用為方法過載。靜態分派發生在編譯階段,因此確定靜態分派的動作實際上不是由虛擬機器來執行的。動態分派 典型應用為重寫,是一種動態的概念。向上轉型後呼叫子類覆寫的方法便是乙個很好地說明動態分派的例子。就是說,我們在判...
深入理解JVM之七 靜態分派與動態分派
public class o static class b extends a static class c extends a public void a a a public void a b b public void a c c public static void main string ...