是如何执行方法调用上_第1页
是如何执行方法调用上_第2页
是如何执行方法调用上_第3页
已阅读5页,还剩3页未读, 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

04|JVM是如何执行方法调用的?(上朗读人 13′37′′|参数方法的重载造成的。(注:文档建议避免重载可变长参数方法,见[1]的最后一段。voidvoidinvoke(Objectobj,Object...args){...voidinvoke(Strings,Objectobj,Object...args){...invoke(null, //调用第二个invoke方invoke(null,1,2);//调用第二个invoke方invoke(null,newObject[]{1});//只有手动绕开可变长参数的语法糖//才能调用第一个invoke以及为Object…的变长参数;而第二个则接收一个String、一个Object,以及为这里调用第一个方法,传入的参数为(null,1)。也就是说,为Object的形式参数所对应的实际参数为null,而变长参数则对应1。JavaJava重载与重在Java程序里,如果同一个类中出现多个名字相同,并且参数类型相同的方法,那么它无法通小知识:这个限制可以通过字节码工具绕开。也就是说,在编译完成之后,我们可以再向class文件重载的方法在编译过程中即可完成识别。具体到每一个方法调用,Java在开头的例子中,当传入null时,它既可以匹配第一个方法中为Object的形式参数,也可以匹配第二个方法中为String的形式参数。由于String是Object的子类,因此Java10086JVM的静态绑定和动态绑JavaJava虚拟机识别方法的关键在于类名、方法名以及方法描述符(methoddescriptor)。前面Java可以看到,JavaJava了返回类型,因此Java虚拟机能够准确地识别目标方法。JavaJavaJava2Java由于对重载方法的区分在编译阶段已经完成,我们可以认为Java虚拟机不存在重载这一概念。因此,在某些文章中,重载也被称为静态绑定(staticbinding),或者编译时多态(compile-timepolymorphism);而重写则被称为动态绑定(dynamicbinding)。这个说法在重写,因此Java编译器会将所有对非私有实例方法的调用编译为需要动态绑定的类型。invokespecialsuperinterface客户interface客户boolean}class商户publicdouble折后价格客户{*}} 商extends商户publicdouble折后价格,客户某客户if(某客户.isVIP())//*//}elsereturnsuper.折后价格 ,某客户//}}publicstaticdouble()//咱们的杀熟算法 returnnew////++}}double法。如果客户是VIP,那么它会被给到一个更低的折扣。为invokestatic指令。如果客户不是VIP,那么我们会通过super关键字调用父类的“折后价格”方法。该调用会被编译为invokespecial指令。在静态方法“价格”中,我们会调用Random类的构造器。该调用会被编译为nextDouble方法。该调用会被编译为invokevirutal指令。invokestaticinvokespecialJavainvokevirtualinvokeinterface调用指令的符在编译过程中,我们并不知道目标方法的具体内存地址。因此,Java符号和非接口符号。我在文章中贴了一个例子,利用“javap-v”打印某个类的常量//在商.class的常量池中,#16为接口符号,指向接口方法"客户.isVIP()"。而#22为非接口符号$javap-v商.class...Constantpool:#16=InterfaceMethodref# //客户#22= //商.价格上一篇中我曾提到过,在执行使用了符号的字节码前,Java虚拟机需要解析这些符号引对于非接口符号,假定该符号所指向的类为C,则Java虚拟机会按照如下步骤进行查CCObjectCC对于接口符号,假定该符号所指向的接口为I,则Java虚拟机会按照如下步骤进行查IObject如果没有找到,则在I的超接口中搜索。这一步的搜索结果的要求与非接口符号步骤总结与实JavaJavaJavaJava分了重载的方法,因此可以认为Java虚拟机中不存在重载。在class文件中,Java编译器会用符号指代目标方法。在执行调用指令前,它所附带的符法来弥补。今天的实践环节,我们来看一下两个生成桥接方法的例子。你可以通过“javap-v”来查看class文件所包含的方法。interfaceinterface{boolean}classMerchantpublicNumberactionPrice(doubleprice,Customercustomer)}}classNaiveMerchantextends{publicDoubleactionPrice(doubleprice,Customercustomer)}}classMerchant<TextendsCustomer>publicdoubleactionPrice(doublepri

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论