天天看点

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,这种方式就叫动态分派。