JVM方法调用-解析和分派
请大家看看我对这个的理解对不对。
如果调用一个虚方法-invokevirtual,首先会在编译时通过静态分派,确定它的重载版本,也就是根据参数的静态类型确定是哪个方法
然后运行时再通过动态分派,通过对象的实际类型来确定执行哪个类的方法。具体就是先找具体类型,如果有这个方法,执行;没有就去父类寻找,如此循环。最后将符号引用转化为直接引用
如果调用的是一个非虚方法-invokestatic、invokespecial或者被final修饰的方法,首先还是通过静态分派,确定方法的重载版本。
但是因为这些方法都不可能被重写,所以在类加载的解析阶段就会直接把它们转化为直接引用
静态分派发生在编译时,确定方法重载版本
动态分派发生在运行时,也就是动态连接, 方法调用者不唯一,方法重写的实现
解析发生在类加载的解析阶段,方法调用者唯一