保健励志美文体育育儿作文
投稿投诉
作文动态
热点娱乐
育儿情感
教程科技
体育养生
教案探索
美文旅游
财经日志
励志范文
论文时尚
保健游戏
护肤业界

Java及JVM是如何识别重载重写方法的?

  可变长参数方法的重载造成的。(官方文档建议避免重载可变长参数方法,见〔1〕的最后一段。)案例voidinvoke(Objectobj,Object。。。args){。。。}voidinvoke(Strings,Objectobj,Object。。。args){。。。}invoke(null,1);调用第二个invoke方法invoke(null,1,2);调用第二个invoke方法invoke(null,newObject〔〕{1});只有手动绕开可变长参数的语法糖,才能调用第一个invoke方法
  某API定义了两个同名重载方法:第一个接收一个Object,以及声明为Object的变长参数第二个则接收一个String、一个Object,以及声明为Object的变长参数
  想调用第一个方法,传参(null,1),即声明为Object的形式参数所对应的实际参数为null,而变长参数则对应1。之所以不提倡可变长参数方法重载,是因为Java编译器可能无法决定应该调用哪个目标方法。这种情况下,编译器会报错,并且提示这方法调用有二义性。然而,Java编译器直接将我的方法调用识别为调用第二个方法,这究竟是为什么呢?
  Java虚拟机是怎么识别目标方法的?重载与重写
  同一类中出现多个:名字相同参数类型相同
  的方法,则无法编译。如想在同一个类中定义名字相同方法,它们参数类型必须不同。这些方法之间的关系称为重载。
  这限制可通过字节码工具绕开,编译完成后,可再向class文件中添加方法名和参数类型相同,而返回类型不同的方法。当这种包括多个方法名相同、参数类型相同,而返回类型不同的方法的类,出现在Java编译器的用户类路径上时,它是怎么确定需要调用哪个方法的呢?当前版本的Java编译器会直接选取第一个方法名以及参数类型匹配的方法。并且,它会根据所选取方法的返回类型来决定可不可以通过编译,以及需不需要进行值转换等。重载的方法在编译过程中即可完成识别。具体到每一个方法调用,Java编译器会根据所传入参数的声明类型(注意与实际类型区分)来选取重载方法。选取的过程共分为三个阶段:在不考虑对基本类型自动装拆箱及可变长参数情况下选取重载方法如在第1个阶段没找到适配方法,那在允许自动装拆箱,但不允许可变长参数情况下选取重载方法如在第2个阶段中没找到适配方法,那在允许自动装拆箱及可变长参数情况下选取重载方法
  如Java编译器在同一阶段中找到多个适配方法,那它会在其中选择一个最为贴切,贴切程度关键就是形式参数类型的继承关系。
  传入null时,它既可匹配第一个方法中声明为Object的形式参数,也可匹配第二个方法中声明为String的形式参数。由于String是Object的子类,因此Java编译器会认为第二个方法更贴切。除同一个类中的方法,重载也可作用于这个类所继承而来的方法。如子类定义了与父类中非私有方法同名的方法,且这两个方法的参数类型不同,那在子类中,这两个方法同样构成重载。
  若子类定义与父类中非private方法的同名方法,且这两方法参数类型相同,那这俩方法间啥关系:若这俩都是static方法,那子类中的方法隐藏了父类中的方法若都不是static的,则子类的方法重写了父类中的方法
  Java的方法重写是多态的体现:允许子类在继承父类部分功能同时,拥有自己独特行为。重写调用会根据调用者的动态类型选取实际的目标方法。JVM的静态绑定和动态绑定
  Java虚拟机识别方法的关键在于类名、方法名及方法描述符(methoddescriptor)。方法描述符由方法的参数类型及返回类型构成。同一类中,如同时出现多个名字相同且描述符相同的方法,那Java虚拟机会在类的验证阶段报错。Java虚拟机与Java语言不同,它不限制名字与参数类型相同,但返回类型不同的方法出现在同一类,对调用这些方法的字节码,由于字节码所附带的方法描述符包含了返回类型,因此Java虚拟机能够准确识别目标方法。
  JVM方法重写判定同样基于方法描述符。如子类定义了与父类中非私有、非静态方法同名的方法,则仅当这俩方法的参数类型及返回类型一致,JVM才会判定为重写。
  对Java中重写而Java虚拟机中非重写的情况,编译器会通过生成桥接方法〔2〕实现Java的重写语义。
  由于对重载方法的区分在编译阶段已完成,可认为JVM不存在重载概念。因此,某些文章将重载称为静态绑定(staticbinding)或编译时多态(compiletimepolymorphism)重写称为动态绑定(dynamicbinding)
  这说法在JVM语境下并非完全正确,因为某类中的重载方法可能被它的子类重写,因此JVM会将所有对非私有实例方法的调用编译为需要动态绑定的类型。JVM的:静态绑定指在解析时便能够直接识别目标方法动态绑定指要在运行过程中,根据调用者的动态类型来识别目标方法
  Java字节码中与调用相关的指令有:invokestatic:调用静态方法invokespecial:调用私有实例方法、构造器及使用super关键字调用父类的实例方法或构造器,和所实现接口的默认方法invokevirtual:用于调用非私有实例方法invokeinterface:用于调用接口方法invokedynamic:用于调用动态方法较为复杂
  编译生成这四种调用指令的情况。interface客户{booleanisVIP();}class商户{publicdouble折后价格(double原价,客户某客户){return原价0。8d;}}class奸商extends商户{Overridepublicdouble折后价格(double原价,客户某客户){if(某客户。isVIP()){invokeinterfacereturn原价价格歧视();invokestatic}else{returnsuper。折后价格(原价,某客户);invokespecial}}publicstaticdouble价格歧视(){咱们的杀熟算法太粗暴了,应该将客户城市作为随机数生成器的种子。returnnewRandom()invokespecial。nextDouble()invokevirtual0。8d;}}
  商户类定义了一个成员方法,叫折后价格,它接收一个double类型参数及一个客户类型参数。这里客户是个接口,定义了一个接口方法isVIP。
  奸商类这个方法,首先调用客户isVIP,该调用会被编译为invokeinterface指令若客户是VIP,则调用奸商类的一个名叫价格歧视的静态方法。该调用会被编译为invokestatic指令如客户不是VIP,则通过super调用父类的折后价格方法。该调用会被编译为invokespecial指令
  在静态方法价格歧视会调用Random类的构造器。该调用会被编译为invokespecial指令。然后以这个新建Random对象为调用者,调用Random类中的nextDouble方法。该调用会被编译为invokevirutal指令。
  对于invokestatic以及invokespecial而言,Java虚拟机能够直接识别具体的目标方法。
  而对于invokevirtual以及invokeinterface而言,在绝大部分情况下,虚拟机需要在执行过程中,根据调用者的动态类型,来确定具体的目标方法。
  如虚拟机能确定目标方法有且仅有一个,比如说目标方法被标记为final3,它可不通过动态类型,直接确定目标方法。调用指令的符号引用
  编译过程中,我们并不知目标方法的具体内存地址。因此,Java编译器会暂时用符号引表示该目标方法。这符号引用包括目标方法所在的类或接口的名字,以及目标方法的方法名和方法描述符。
  符号引用存储在class文件的常量池。根据目标方法是否为接口方法,这些引用可分为:接口符号引用非接口符号引用在奸商。class的常量池中,16为接口符号引用,指向接口方法客户。isVIP()。22为非接口符号引用,指向静态方法奸商。价格歧视()。javapv奸商。class。。。Constantpool:。。。16InterfaceMethodref27。29客户。isVIP:()Z。。。22Methodref1。33奸商。价格歧视:()D。。。
  执行使用了符号引用的字节码前,JVM需解析这些【符号引用】并替换为【实际引用】。
  对【非接口符号引用】,假定该【符号引用】所指向的类为C,则JVM按如下步骤查找:在C中查找符合名字及描述符的方法若没找到,搜索C的父类,直至Object类若还没找到,在C所直接实现或间接实现的接口中搜索,该步搜索得到的目标方法必须是非private、非static且若目标方法在间接实现的接口中,则需满足C与该接口间无其他符合条件的目标方法。若有多个符合条件的目标方法,则返回其中任一。
  所以static方法也可通过子类来调用。子类的static方法会隐藏(这不是重写)父类中的同名、同描述符的静态方法。
  对于接口符号引用,假定该符号引用所指向的接口为I,则Java虚拟机会按照如下步骤进行查找。在I中查找符合名字及描述符的方法。如果没有找到,在Object类中的公有实例方法中搜索。如果没有找到,则在I的超接口中搜索。这一步的搜索结果的要求与非接口符号引用步骤3的要求一致。
  经过上述解析步骤后,符号引用会被解析成实际引用:对可静态绑定的方法调用,实际引用是个指向方法的指针对需动态绑定的方法调用,实际引用则是个方法表的索引总结与实践
  本文介绍了Java以及Java虚拟机是如何识别目标方法的。
  在Java方法的:重载,方法名相同而参数类型不相同的方法间重写,方法名相同参数类型也相同的方法间
  JVM识别方法的方式除了方法名和参数类型,还有返回类型。
  JVM的:静态绑定:在解析时便能够直接识别目标方法的情况动态绑定,需在运行过程中根据调用者的动态类型来识别目标方法的情况。由于Java编译器已区分重载方法,因此可认为JVM不存在重载
  在class文件中,Java编译器会用符号引用指代目标方法。在执行调用指令前,它所附带的符号引用需要被解析成实际引用。对于可以静态绑定的方法调用而言,实际引用为目标方法的指针。对于需要动态绑定的方法调用而言,实际引用为辅助动态绑定的信息。
  Java的重写与Java虚拟机中的重写并不一致,但编译器会通过生成桥接方法来弥补。
  〔1〕https:docs。oracle。comjavase8docstechnotesguideslanguagevarargs。html〔2〕https:docs。oracle。comjavasetutorialjavagenericsbridgeMethods。html
  〔3〕https:wiki。openjdk。java。netdisplayHotSpotVirtualCalls
  〔4〕https:wiki。openjdk。java。netdisplayHotSpotInterfaceCalls

有关柳树的作文篇一:小柳树在荣昌城的护城河两边,种了许多柳树。那柳树高高的个子,长长的柳枝倒垂下来,有的甚至都碰着水面了。春天,长长的柳枝上钻出了一粒粒鹅黄色的嫩芽,就像小鸟的嘴……市场消息苹果(AAPL。US)聘请了在福特工作31年的资深员市场消息:苹果(AAPL。US)聘请了在福特工作31年的资深员工来加速其汽车项目。苹果(AAPL。US)公司简介:苹果公司从事设计、制造和销售智能手机、个人电脑、平板电脑……ZD19便携式免扣打包机适合哪些行业使用产品名称:一键式自动打包机产品品牌:KBQPACK产品商标:TNZC28429934D01T181222产品产地:深圳产品型号:ZD19产品颜色:……沿江公园作文沿江公园的江就是甬江,江的对面是北仑区,而江的这边就是我们镇海区,周边树木环绕,花草盛开,还真是个美景之乡呢!下面我们来看看沿江公园作文,欢迎阅读借鉴。沿江公园作文1我的……倒霉的一天ldquo;秋起爽临风凄,木门作曲终难眠。rdquo;,今天一大早,我带着朦胧的睡眼、浓浓的睡意,爬下那温暖舒适的床。没办法!谁叫那门这么亢奋呢!大清早的就在那ldquo;一展……2015年高考作文题预测及范文分享是一种美德阅读下面的材料,按照要求作文。(60分)黑暗中,一块石头见身边的一块钻石没有一点光泽,便嘲笑道:ldquo;我不知道平时人们为什么把你抬得那么高,把你视作宝贝。现在你跟我……初中描写城市夜景的优秀作文导语:皎洁的月光如水银般洒向人间,整个城市都沐浴在柔和又明净旳夜色中,那感觉舒服极了。下面是小编整理的一些关于夜的优秀作文,欢迎查阅。篇一:上海的夜景放暑假时,我从攀枝花……听见万物生长的声音作文800字季节随着时间的更迭,而不断的轮回着,眼看着,春天就已经悄然而至了。ldquo;人间四月芳菲尽,山寺桃花始盛开。rdquo;伴随着倒春寒的风呼啸而过的声音,立春已至,四月还……爱是什么比喻句有哪些1、恋爱就象,盗版总是比正版流行。2、恋爱是什么关于恋爱的十个形象比喻3、恋爱就象拥有两只手表,你总是无法说清,到底哪个时间更准?4、恋爱就像小偷,没有一天能……从未走远初三优秀作文常于题海中迷迷糊糊的醒悟过来,抬起头,发现那从未走远的故乡萦绕在脑中。站立于钢筋铁泥之中,突兀地发现了自己在人群中的迷惘。睁开睡眼惺忪的眼皮,尽是一片故土的幻影。终于,借……精选描写偶像的作文400字集锦9篇在日常的学习、工作、生活中,大家都写过作文,肯定对各类作文都很熟悉吧,作文是通过文字来表达一个主题意义的记叙方法。相信很多朋友都对写作文感到非常苦恼吧,以下是小编为大家收集的描……想念小学校园里的每一个角落作文是它(母校)给我的小学涯画上了一个完美的句号,是它给予我童年的美好记忆,是它让我在知识的海洋中遨游,是它让我懂得知足常乐如今,即将告别美丽的校园,心中总有一种依依不舍的感觉。……
高晓松正式从阿里离职,微博简介更新,设置半年可见有着很多头衔的高晓松目前被曝光从阿里离职,结束长达六年的任职,其实在2016年高晓松就已经辞去阿里音乐董事长一职,出任阿里娱乐战略委员会主席。2019年10月21日高晓松不再担……北汽曾高居新能源汽车销售量,榜首发布了阿尔法S,试驾活动开启北汽曾高居新能源汽车销售量榜首,近日发布了阿尔法S,试驾活动开启北汽是中国最早推广新能源的一个企业,它曾经在一个月销售了3万多台新能源汽车,高居新能源汽车的销售量榜首。然……实用冬至的作文700字汇总7篇在平时的学习、工作或生活中,大家都不可避免地要接触到作文吧,作文是一种言语活动,具有高度的综合性和创造性。那么,怎么去写作文呢?以下是小编收集整理的冬至的作文700字7篇,仅供……从我做起保护环境作文六月五日是新的一届世界环境日,三十三年来,环境确实得到了好转,但我们仍不能把这些好转作为乐观的理由!大气污染,噪音污染、固体废物、有、毒化、学品已经让地球变得百孔千疮,让人类的……朋友的味道作文800字在每个人的身上都用一种不同的味道,你的味道特别,那在于我对你的想念我的朋友。在小学毕业的时候我们俩分开了,去了自己人生中的第一次选择,奔相了不同的方向。我一直在寻找,为什……矮大紧高晓松离职阿里巨人教育宣布倒闭银隆终究成为格力的子公司高晓松离职阿里阿里大文娱告别矮大紧8月31日,原阿里音乐董事长、著名音乐人高晓松,已于近日从阿里离职。媒体就此向阿里大文娱方面求证,对方表示并不清楚。2015年7月……赞助表示时间短的词语时间每时每刻都在流逝,我们应该如何形容时间短呢?以下是小编精心准备的赞助表示时间短的词语,大家可以参考以下内容哦!赞助表示时间短的词语【1】片刻:极短的时间;一会儿。……关于六年级小学作文1400字合集7篇无论是在学校还是在社会中,大家最不陌生的就是作文了吧,根据写作命题的特点,作文可以分为命题作文和非命题作文。还是对作文一筹莫展吗?以下是小编精心整理的六年级小学作文1400字7……全民炒币美国小兄妹在车库建以太坊矿场,月入3。5万美元一对美国的小兄弟姐妹在车库里建了一座以太坊矿。他们从一台游戏电脑开始,逐渐用赚来的钱购买新的采矿设备。目前,他们的月收入已达35000美元。14岁的伊桑塔库尔和9岁的妹妹安雅住……韩国最终妥协,美国正式介入中韩半导体收购案,合同或被彻底搅黄目前中国的显示面板产能已经跃居全球第一,可是一个很严峻的现实摆在我们面前,那就是用于显示面板的驱动芯片,中国依旧需要从外国进口,虽然也不会影响到显示面板生产,可如果中国想要真正……写给钟南山爷爷的一封信敬爱的钟南山爷爷:您好!我是杭州市临安区的一名六年级小学生。这个年很特别,整个假期我都待在家里。在这期间,我每天都会了解肺炎疫情,深刻体会到了它的残酷。与此同时,我……未来央行数字货币的应用还有望向商户开放除出行场景外,还有专业人士指出,未来央行数字货币的应用还有望向商户开放。7月9日,国盛证券区块链分析师宋嘉吉就在最新发表的研报中指出,我们认为,央行数研所此次与滴滴的合作……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网