为了账号安全,请及时绑定邮箱和手机立即绑定

关于继承的小问题

关于继承的小问题

狐的传说 2019-05-25 13:32:10
刚从大学进入工作岗位的实习生,java方向,进入工作岗位后才知以前学的东西只是知其一不知其二....再从温习继承一块有个疑问//定义一个昆虫类,里面有攻击和移动两个方法packagetest03;publicclassInsect{privateintsize;privateStringcolor;publicintgetSize(){returnsize;}publicvoidsetSize(intsize){this.size=size;}publicStringgetColor(){returncolor;}publicvoidsetColor(Stringcolor){this.color=color;}publicInsect(intsize,Stringcolor){this.size=size;this.color=color;}//移动publicvoidmove(){System.out.println("move");}//攻击publicvoidattack(){//攻击之前要移动move();System.out.println("attack");}}packagetest03;//定义一个蜜蜂类,并继承昆虫夫类publicclassBeeextendsInsect{publicBee(intsize,Stringcolor){super(size,color);}@Overridepublicvoidmove(){System.out.println("fly");}@Overridepublicvoidattack(){move();//这里super会调用夫类Insect.attack方法super.attack();//System.out.println("Attack");}}/*测试类*/publicclassTestMain{publicstaticvoidmain(String[]args){Beeb=newBee(1,"red");b.attack();}}//显示效果是flyflyattack第一个fly是执行了Bee类里的move方法,super.attack();执行后会走到父类里的attack里再继续为什么走Bee的move()而不是父类的move()whynot?flymoveattack
查看完整描述

2 回答

?
MM们

TA贡献1886条经验 获得超2个赞

1、java类是运行在jvm(java虚拟机)中的,所以这里的执行效果取决于jvm规范对于方法执行效果的定义2、jvm在执行一个方法的时候,有以下知识点
2.1.执行方法前,虚拟机读取class文件至内存,并生成对应的Class对象放在静态区中。跟你这个问题比较相关的一点是,虚拟机会针对每个类的所有方法,形成一个虚函数表,以实现运行(调用)时的快速查找。
2.2.当加载一个具有继承体系的类时,会先加载父类,先调用父类的构造函数,在执行子类的构造函数。虚函数表的生成同样也具有这种先后顺序。子类会覆盖同名的父类虚方法表中同名同可见性方法。
2.3.具有继承层次的类的虚方法表查找,默认先查找子类虚方法表,找不到才会找父类的。
结合题主的例子,当TestMain中,执行到b.attack();方法时,默认读取的自然是bee类的虚函数表,由2.2可知:
第一个fly:bee.attack()——>bee.move()
第二个fly:bee.attack()——>bee.move()——>inset.attack()——>bee.move()
//之所以这里会由insect.attack()里执行到bee.move()就是前面说得,insect作为实例化bee类顺带生成的内置父类对象,默认读取虚方法表会优先从子类开始查找
题外话,题主可以思考一下为什么java要这么设计虚方法表的调用逻辑,与多态的实现又有什么关系?
有关jvm内存机制的具体知识,可见传送门:《深入理解java虚拟机》学习笔记系列——java内存区域划分《深入理解java虚拟机》学习笔记系列——对象的内存布局《深入理解java虚拟机》学习笔记系列——垃圾收集器&内存分配策略
                            
查看完整回答
反对 回复 2019-05-25
?
MMTTMM

TA贡献1869条经验 获得超4个赞

因为Bee类继承了Insect类,所以Bee类调用方法会优先到当前类中找寻,没有才会调用父类的方法,由于Bee类自己存在move方法的,所以就不会调用父类的move方法,而为什么会调用父类的attack方法是因为你用了super,如果你用super.move
                            
查看完整回答
反对 回复 2019-05-25
  • 2 回答
  • 0 关注
  • 267 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号