天天看點

jvm方法調用

java程式在運作中無時無刻不再進行着方法的調用。方法調用和方法執行是兩個過程。方法調用是指找到要執行的方法版本。方法執行是真正的執行方法。

java的方法調用是由兩個重要對象來決定的,一個是編譯器,一個是jvm。不是說編譯器和jvm是兩個獨立的對象啦,隻是對應程式運作兩個不同的階段,即編譯期和運作期。java裡的方法調用可以分為兩種,一種是在編譯期就能決定的,這種方法大緻包括:靜态方法、私有方法、執行個體構造器、父類方法和final修飾的方法。所有方法調用的目标方法在class檔案中都是常量池的一條符号引用,方法調用的過程就是把符号引用轉化為方法的直接引用。在編譯期就能确定方法調用的目标,并且目标方法不會變化的話,在類加載過程中就會直接将符号引用轉化為直接引用,這個過程叫靜态解析。

另外一種就是在運作期才能确定的。這種方法調用叫做分派,分派也分靜态和動态。一個引用類型的變量有其實有兩種屬性,比方  animal  a = new cat();  animal是a的靜态類型或外表類型,而cat則是a的實際類型,當方法重載時,比如  saymyname(animal c)和saymyname(cat c)  我們調用saymyname(a)的時候,實際發生的調用目标方法是saymyname(animal c),也就是說這種情況下發生的調用是根據參數的靜态類型來判斷的,這種調用可以在編譯期就可以确定,稱之為靜态分派。另外一種情況是animal有 一個方法sayhello(){system.out.println("i am a animal!");},在cat裡重寫了這個方法sayhello(){system.out.println("meow~~");},  當執行  a.sayhello()時,實際調用的目标方法是cat裡的sayhello,這種方式就叫動态分派。