【深入java虚拟机(5)】:多态性实现机制——静态分派与动态分派-编程开发技术

【深入java虚拟机(5)】:多态性实现机制——静态分派与动态分派-编程开发技术

ID:30790103

大小:78.68 KB

页数:6页

时间:2019-01-03

【深入java虚拟机(5)】:多态性实现机制——静态分派与动态分派-编程开发技术_第1页
【深入java虚拟机(5)】:多态性实现机制——静态分派与动态分派-编程开发技术_第2页
【深入java虚拟机(5)】:多态性实现机制——静态分派与动态分派-编程开发技术_第3页
【深入java虚拟机(5)】:多态性实现机制——静态分派与动态分派-编程开发技术_第4页
【深入java虚拟机(5)】:多态性实现机制——静态分派与动态分派-编程开发技术_第5页
资源描述:

《【深入java虚拟机(5)】:多态性实现机制——静态分派与动态分派-编程开发技术》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、【深入Java虚拟机(5)】:多态性实现机制——静态分派与动态分派-编程开发技术【深入Java虚拟机(5)】:多态性实现机制——静态分派与动态分派原文岀处:兰亭风雨方法解析Class文件的编译过程中不包含传统编译中的连接步骤,一切方法调用在Class文件里面存储的都只是符号引用,而不是方法在实际运行时内存布局中的入口地址。这个特性给Java带来了更强大的动态扩展能力,使得可以在类运行期间才能确定某些目标方法的直接引用,称为动态连接,也有一部分方法的符号引用在类加载阶段或第一次使用时转化为直接引用,这种转化称为静态解析。这在前面的“Java内存区域与内存溢出”一文中有提到。静态解析成立的前提是

2、:方法在程序真正执行前就有一个可确定的调用版本,并且这个方法的调用版木在运行期是不可改变的。换句话说,调用FI标在编译器进行编译时就必须确定下来,这类方法的调用称为解析。在Java语言中,符合“编译器可知,运行期不可变”这个要求的方法主要有静态方法和私有方法两大类,前者与类型直接关联,后者在外部不可被访问,这两种方法都不口J能通过继承或别的方式重写出其他的版本,因此它们都适合在类加载阶段进行解析。Java虚拟机里共提供了四条方法调用字节指令,分别是:•invokestatic:调用静态方法。•invokespecial:调川实例构造器vinit>方法、私冇方法和父类方法。•invokevir

3、tual:调用所有的虚方法。•invokeinterface:调用接口方法,会在运行吋再确定一个实现此接口的对象。??只要能被invokestatic和invokespecial指令调用的方法,都町以在解析阶段确定唯一的调用版本,符合这个条件的有静态方法、私有方法、实例构造器和父类方法四类,它们在类加载时就会把符号引用解析为该方法的直接引用。这些方法可以称为非虚方法(还包括final方法),与之相反,其他方法就称为虚方法(final方法除外)。这里要特别说明下final方法,虽然调用final方法使用的是invokevirtual指令,但是由于它无法覆盖,没有其他版本,所以也无需对方发接收者

4、进行多态选择。Java语言规范中明确说明了final方法是一种非虚方法。??解析调川一定是个静态过程,在编译期间就完全确定,在类加载的解析阶段就会把涉及的符号引用转化为可确定的肓接引用,不会延迟到运行期再去完成。而分派调用则可能是静态的也可能是动态的,根据分派依据的宗虽数(方法的调用者和方法的参数统称为方法的宗最)又可分为单分派和多分派。两类分派方式两两组合便构成了静态单分派、静态多分派、动态单分派、动态多分派四种分派情况。静态分派所冇依赖静态类型來定位方法执行版本的分派动作,都称为静态分派,静态分派的最典型应用就是多态性中的方法重载。静态分派发生在编译阶段,因此确定静态分配的动作实际上不是

5、由虚拟机来执行的。下而通过一段方法重载的示例程序来更清晰地说明这种分派机制:classHuman{}classMemcxtcndsIluman{}classWomanextendsHuman{publicclassSteitiePai{publicvoidsay(Humanhum){System・out.priamhuman'7);}publicvoidsay(Manhum){System,out.printIn("Iamman/,);}publicvoidsay(Womanhum){System,out.printin(,ZTamwoman,z);publicargs){staticvoi

6、dmain(String[]Humanman二newMan();Humanwomein二newWoman();StaticPaisp二newStatiePai();sp.say(man);sp.say(woman);上而代码的执行结果如下:1amhumanIamhuman以上结果的得出应该不难分析。在分析为什么会选择参数类型为Human的重载方法去执行之前,先看如下代码:Humanman=newMan();??我们把上而代码屮的“HumE称为变量的静态类型,示曲的“Man”称为变量的实际类型。静态类型和实际类型在程序中都可以发牛一些变化,区别是静态类型的变化仅仅在使用吋发生,变量本少的静态类

7、型不会被改变,并且最终的静态类型是在编译期可知的,而实际类型变化的结果在运行期才可确定。??回到上面的代码分析中,在调用say()方法时,方法的调用者(回忆上1衍关于宗量的定义,方法的调用者属于宗量)都为sp的前提下,使用哪个重载版本,完全取决于传入参数的数量和数据类型(方法的参数也是数据宗量)。代码中刻意定义了两个静态类型相同、实际类型不同的变量,可见编译器(不是虚拟机,因为如果是根据静态类型做出的判断,那

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。