种太阳✔ 2016-01-09 16:23 采纳率: 66.7%
浏览 1802

关于java中的重写和向上转型问题

在讲成员方法重写时,变量调用的是子类重写后的方法还是父类的原方法,是由变量所指向的对象实例的类型决定,而不是由变量本身的类型决定。可是比如下图的程序,PrivOverride po=new Derived,这个po到底是父类类型还是子类类型呢?按照重写的规定,那么调用po.f()调用的应该是子类的f方法,那么这个po就应该是子类类型吧?可是按照向上转型的说法,这个po就是父类类型的,所以有点搞不清。。而且父类的f方法是private的,子类不能继承(子类是不能继承父类的private型的成员变量和方法的吧?),而子类又自己重新实现了一个public型的f方法,那么最后输出的时候为什么不输出子类重新实现的这个public型的f方法而是输出父类的f方法的结果呢?图片

  • 写回答

3条回答 默认 最新

  • 卖鱼强3 2019-06-04 20:56
    关注

    首先,PrivOverride 中的方法f()是private的,方法f()对子类不可见,因而子类不能继承和重写方法f()。子类中的public void f()是一个新的方法,和基类中的方法无关。(@Override public void f()会报错,证明覆盖失败。)
    再次,要理解向上转型的过程,向上转型过程中,子类型会保留和基类型接口相同的方法,丢失其它方法。本例中的子类方法并没有重写成功,即其方法与基类型接口不一样,PrivOverride po = new Derivied 转型为基类引用后,就不能调用public void f(),这个方法了,因为转型后丢失了
    然后回到你的问题:po是基类类型,如果基类方法是public void f(),即子类成功覆盖基类方法(po向上转型时保留了子类接口),po.f()调用的才是子类方法,才能实现多态,否则po.f()调用的是基类方法。
    因而你的第一句“变量调用的是子类重写后的方法还是父类的原方法,是由变量所指向的对象实例的类型决定,而不是由变量本身的类型决定。”,这句话不准确的。

    评论

报告相同问题?

悬赏问题

  • ¥15 深度学习根据CNN网络模型,搭建BP模型并训练MNIST数据集
  • ¥15 lammps拉伸应力应变曲线分析
  • ¥15 C++ 头文件/宏冲突问题解决
  • ¥15 用comsol模拟大气湍流通过底部加热(温度不同)的腔体
  • ¥50 安卓adb backup备份子用户应用数据失败
  • ¥20 有人能用聚类分析帮我分析一下文本内容嘛
  • ¥15 请问Lammps做复合材料拉伸模拟,应力应变曲线问题
  • ¥30 python代码,帮调试,帮帮忙吧
  • ¥15 #MATLAB仿真#车辆换道路径规划
  • ¥15 java 操作 elasticsearch 8.1 实现 索引的重建