java中多态的一个小问题? 多态java对象 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 1、 62、 a、你不要纠结父类是怎么样的,实际上只有1个类,就是子类,子类会获得父类的方法,实际上执行的还是子类,所以第一问,为什么是6,因为是子类执行的方法,子类里又有自己定义的num覆盖了从父类集成的num,所以打印出来的是自己的6,如果不覆盖,打印的就是5; b、这个学名叫做重写,是子类覆盖掉了父类的方法,如果不覆盖,执行的是父类的逻辑,如果覆盖,执行的是子类的逻辑 eclipse直接运行结果如下:第一个Fu show 5第二个Zi show 6 1:Fu show 5 子类没有Override父类的show方法,相当于Override的时候写了一个super.show(),父类根本不知道子类有个叫num的东西,只会打印自己的num,所以是5。2:Zi show 6 子类Override了父类的方法,子类就拥有了自己的行为,所以就知道自己有个叫num的东西,打印6。不知道这样解释通不通,期待高人来解释。 疏忽了,第一个问题打印出来确实是5,这里给LZ从两个层面解释一下:语法层面,子类里引用父类的方法,父类方法里引用的域是父类的域,不是子类的域,所以打印出来是5.这个方法如果存在在子类里,引用的是this.i,也就是子类的域,如果想引用到父类的域,可以用super.i,换句话说,子类里有两个i,默认是this.i,实际上还有一个被隐藏起来的super.i。编译层面,我特意查了一下编译出来的字节码,从字节码来看,子类继承父类,但是父类的方法并没有出现在子类的字节码里,换句话说,在内存的角度上,子类的内存空间里只有子类自己的东西,而父类的东西都存在于一个super指针里,所以当调用父类的方法的时候,实际上是进入了super指针指向的父类的内存空间,这个内存空间里是肯定不会有子类的域的,所以这里只能引用到父类的域,打印出来是5. 这两段程序的关键在于this.num1、Zi没有show方法,故上溯到Fu。因此用的是Fu的num值。2、Zi重写了show方法,故只需调用自身的show方法即可。因此用的是Zi的num值。 涉及到重写的问题,本来基础了父类,就具有了父类的行为,也就是父类的方法,用Fu应用的时候,虚拟机会首先查看父类是否有该方法吧,,子类没有重写,当然调用的是父类的方法,如果子类重写了,就会找到子类的;虚拟机应该是设计成这样的,先在子类找,找不到就默认使用super向上转型找到父类的; 还有一种情况就是,如果父类的show方法是静态的,那就不会调用子类重写的方法了;实际编程的时候应该不会再子类又重新声明了同名的成员变量,本来继承父类就是为了使用父类的成员变量这个属性的 第一个是5 第二个是6 因为 第二个 把父类的show()方法 给覆盖了(重写) 你就这吗理解吧 覆盖了父类的方法 并且重写了 这样 再调用这个方法的时候 就输出了Zi类的结果 如果Zi类还有子类 并且也覆盖了show() 那就跟着他的“孙子”走 以此类推。 为什么编辑窗口下面的撤销不能响应,而帮助下面的查看帮助能响应?求问 String有关问题 寻求帮助,点击链接了,但是链接不上,谢谢啊 为什么把关闭资源放finally中? 如何使用JAVA编写一个3D有光源效果的球星? JTable问题 高手帮帮忙 谢谢了在线等 急~~~~~~~~~~!!! 父类与自类调用顺序问题? 求助:使用jbuilder9调试器时的问题(请高手赐教) RMI传输对象时,对象的方法如何处理? 看看这是什么错误 eclipse调试大纲显示问题 【求助】下面这段 代码有什么错?为什么?
2、
a、你不要纠结父类是怎么样的,实际上只有1个类,就是子类,子类会获得父类的方法,实际上执行的还是子类,所以第一问,为什么是6,因为是子类执行的方法,子类里又有自己定义的num覆盖了从父类集成的num,所以打印出来的是自己的6,如果不覆盖,打印的就是5;
b、这个学名叫做重写,是子类覆盖掉了父类的方法,如果不覆盖,执行的是父类的逻辑,如果覆盖,执行的是子类的逻辑
第一个Fu show 5
第二个Zi show 6
子类没有Override父类的show方法,相当于Override的时候写了一个super.show(),父类根本不知道子类有个叫num的东西,只会打印自己的num,所以是5。
2:Zi show 6
子类Override了父类的方法,子类就拥有了自己的行为,所以就知道自己有个叫num的东西,打印6。
不知道这样解释通不通,期待高人来解释。
1、Zi没有show方法,故上溯到Fu。因此用的是Fu的num值。
2、Zi重写了show方法,故只需调用自身的show方法即可。因此用的是Zi的num值。
还有一种情况就是,如果父类的show方法是静态的,那就不会调用子类重写的方法了;实际编程的时候应该不会再子类又重新声明了同名的成员变量,本来继承父类就是为了使用父类的成员变量这个属性的