Three-Y
2019-09-29 22:31
采纳率: 85.7%
浏览 495
已采纳

一道java面试题,关于继承的问题。

请教一下,为什么第二个输出不是A?谢谢
虽然objectB原来的引用是classB,但是不是强转成classA后才赋给as的吗?
是因为as指向的是objectB仍然定义为classB,所以强转成classA的操作不起作用吗?

图片说明

  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

3条回答 默认 最新

  • @班 2019-09-30 11:04
    已采纳

    图片说明
    这个还涉及到了多态的问题,首先,多态存在的三个必要条件:继承、重写、父类引用指向子类对象。其次当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;如果有,再去调用子类的同名方法。这里的条件都符合多态条件,B继承A,B中重写A的printValue方法,A的引用(as)指向子类B图片说明
    所以输出的是B 而不是A
    还有一点,如果在B中添加一个A没有的方法,你会发现as是不能调用父类A没有而子类B有的方法,这就是多态的原因

    已采纳该答案
    打赏 评论
  • Kevin.Y.K 2019-09-30 09:27

    尽管强转为ClassA,但本质还是ClassB,主要是ClassB重写了ClassA的printValue方法,你可以尝试一下先去掉ClassB中printValue方法

    打赏 评论
  • 王能 2019-09-30 10:07

    java是面向对象的,所谓对象就是一个实体,比如:人。
    现在你new了一个“人”,打印走路方法结果是“直立行走”
    “人”当然也属于“动物类“了,然后你把他放到“动物类里”,再打印走路方法,当然还是“直立行走”了,他虽然在“动物类“里关着,但本质还是“人”。
    这就是面向对象和面向过程的区别之一。

    打赏 评论

相关推荐 更多相似问题