方法调用要确定被调用的方法版本,分为三种,解析调用、静态分派和动态分派。
解析调用
- 解析调用时调用目标在程序代码写好、编译器进行编译那一刻就已经确定下来。
- 解析调用一定是个静态的过程,在编译期间就完全确定,在类加载的解析阶段就会把涉及的符号引用全部转变为明确的直接引用,不必延迟到运行期再去完成。
- 适用于解析调用的方法,包括静态方法、私有方法、实例构造器、父类方法和final修饰的方法。这些方法也被称为“非虚方法”。相对地,其他方法是“虚方法”。
下面的代码,定义一个lock变量,
“Lock”称为这个变量的“静态类型”,或者“外观类型”。
“ReentrantLock”被称为变量的“实际类型”,或者“运行时类型”。
Lock lock = new ReentrantLock();
静态分派
- 所有依赖静态类型来决定方法执行版本的分派动作,都称为静态分派。
- 方法重载就属于静态分派。
- 静态分派发生在编译阶段,分派的动作不是由虚拟机来执行的。
动态分派
- 在运行期根据实际类型确定方法执行版本的分派过程称为动态分派。
- 方法重写属于动态分派。在虚拟机执行方法期间,最终执行的方法版本是属于实际类型的。
- 字段永远不参与多态。当子类声明了与父类同名的字段时,虽然子类内存中两个字段都会存在,但是子类的字段会遮蔽父类的同名字段。
网友评论