向上转型的一些问题

向上转型的一些问题

假设父类Animal,子类Cat,Animal one=new Animal(); Cat two=new Cat(); one=two; 是向上转型,那么如果在Animal类中有一个方法eat,Cat类重写了方法eat,那使用one.之后在提示菜单中显示的eat方法是哪个类的?我测试时后面写了个Animal,但实际上调用了Cat中的,这怎么回事啊?

正在回答

登陆购买课程后可参与讨论,去登陆

2回答

同学你好,父类引用指向子类实例,可以调用子类重写父类的方法以及父类派生的方法,无法调用子类独有方法。如下图所示:

http://img1.sycdn.imooc.com//climg/5e6d8d76092fb48506440534.jpg

如果同学在子类中没有重写eat()方法,则调用的就是父类中的方法。

如果我的回答解决了你的疑惑,请采纳!祝学习愉快!

  • 慕容2892559 提问者 #1
    嗯,姐姐你说的对。其实我想说的是调用子类重写父类的方法时不是应该在提示菜单中显示子类的那个方法么(比如说eat():void — Cat这样),但是实际上显示的是eat():void — Animal,虽然最后结果调用的依然是Cat类的eat()方法,但我就是想问这个显示就是这样么?
    2020-03-15 17:08:24
  • 好帮手慕小尤 回复 提问者 慕容2892559 #2
    同学你好,是的,显示的是父类中的(eat():void — Animal)。如果我的回答解决了你的疑惑,请采纳!祝学习愉快!
    2020-03-15 18:12:14
好帮手慕小脸 2020-03-04 18:36:53

同学你好,

    1、假设父类Animal,子类Cat,Animal one=new Animal(); Cat two=new Cat(); one=two; 是向上转型。

同学理解错误,Animal one=new Cat();才是向上转型。按照课程课程也应该是如下这样:

http://img1.sycdn.imooc.com//climg/5e5f83eb09f70c6f03760133.jpg

按照同学的写法,只是实例化各自对象。

    2、那么如果在Animal类中有一个方法eat,Cat类重写了方法eat,那使用one.之后在提示菜单中显示的eat方法是哪个类的?

    显示的eat方法是Cat类的。因为向上转型的含义是父类的引用指向子类实例。

同学可以重新观看3-2小节向上转型,老师有讲解到。

如果我的回答解决了你的疑惑,请采纳!祝学习愉快!



  • 提问者 慕容2892559 #1
    emmm 现在我懂了向上转型了,可是第二个问题依然是那样。(父类Animal,子类Cat,Animal one=new Cat(); one.eat(); 即使Cat类重写了Animal类的eat方法,提示菜单中依然显示的是Animal类)。
    2020-03-14 17:46:43
  • 提问者 慕容2892559 #2
    实际调用的结果是Cat类
    2020-03-14 17:47:07
  • 好帮手慕小脸 回复 提问者 慕容2892559 #3
    同学你好,Animal one=new Cat();这就是向上转型,one.eat()这个eat方法本身调用的就是Cat类的eat方法。 我们想象一个情景:去商城买宠物,宠物有很多,比如小猫,小狗,小羊等等,这些都属于宠物。现在我们还不知道具体买什么,就可以定义一个宠物的引用animal,当我们买了一只小猫后,就可以将animal的引用指向小猫的对象。这就是向上转型。 如果是老师没有理解同学的意思,同学可贴出代码。方便老师解决问题哦~ 祝学习愉快~
    2020-03-14 19:03:07
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星

相似问题

登录后可查看更多问答,登录/注册

请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师