首页 > 代码库 > jvm方法调用
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,这种方式就叫动态分派。