向上转型的难解

向上转型的难解

1、课程对于Animal one=new Animal();和Animal two=new Cat();之间的区别讲的使人不能理解,听了几遍后还是不懂。Animal two是指声明一个Animal类的对象two,但是保存的引用地址确是子类Cat的实例:new Cat(),不能够理解。

2、基于对第一个问题的难解,更不能明白为什么父类引用指向子类实例,可以调用子类重写父类的方法以及父类派生的方法,无法调用子类独有方法。

3、Animal two=new Cat();
这到底是是Animal的对象实例还是Cat类的?我完全混乱。

4、归根究底,对于什么是多态,在我不懂的这段代码里,体现了多态的什么?

希望老师能以通俗而详细的形式解答我的困惑,不然感觉在这里要被卡死了。谢谢,敬候佳音!

正在回答

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

2回答

同学你好,

1、关于  给这个猫在起了个代号 “two”,但是你当时心里没记住它具体是啥,就记住了它是动物,代号是two;  这是电脑的存储方法,是以面向对象来存储的,通过抽象的大类来具体调用实例化的具体的小类,通过大类不同的实现来调用不同的小类,方便了开发。

2、为什么能调用子类重写父类的方法,还是不理解

例如: 在生活中,动物是一个大类,这个大类中有跑、吃等具体的行为方法,现在有猫、狗、树袋熊这三个具体的子类,假如树袋熊能够上树,我们可以说树袋熊可以上树,但不能说动物可以上树,因为不是所有的动物都会上树,但是可以说树袋熊可以吃饭!

所以说向上转型后,能调用子类重写父类的方法。

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

好帮手慕阿莹 2019-05-06 19:53:17

关于同学的第一个问题:

1、课程对于Animal one=new Animal();和Animal two=new Cat();之间的区别讲的使人不能理解,听了几遍后还是不懂。Animal two是指声明一个Animal类的对象two,但是保存的引用地址确是子类Cat的实例:new Cat(),不能够理解。

Animal one=new Animal(); 这句代码你可以理解为:

你发现了一个动物,然后你内心给这个动物在起了个代号 “one”;

Animal two=new Cat(); 这句代码你可以理解为:

你发现了一个猫,然后你给这个猫在起了个代号 “two”,但是你当时心里没记住它具体是啥,就记住了它是动物,代号是two;

那你说,这个two 代表的是啥,代表的其实就是 之前new 的这个猫。

关于第二个问题:

2、基于对第一个问题的难解,更不能明白为什么父类引用指向子类实例,可以调用子类重写父类的方法以及父类派生的方法,无法调用子类独有方法。

答:

你想啊,你忘记它是猫了,你只能想着,动物two有什么什么方法,你不记得它是猫了呀,怎么能去调用猫特有的方法呢?所以你只能调用它动物的方法。至于为啥它执行的是子类重写的方法。因为它自己知道自己是啥,你让动物two去eat,它肯定去吃猫粮,而不是狗粮,因为它代表的猫的对象。

关于第三个问题:

3、Animal two=new Cat();
这到底是是Animal的对象实例还是Cat类的?我完全混乱。

答:同学可以理解为是Cat类型的对象

第四个问题:

4、归根究底,对于什么是多态,在我不懂的这段代码里,体现了多态的什么?

我举个例子:

比如你想看动物吃东西,跑,跳等等。可能你一会儿想看dog,一会儿想去看Cat。

那你可以想看猫的时候: Animal three = new Cat();

three.吃();

three.跑();

three.跳();

想看狗了,只修改Animal three = new Dog();就可以了。

three.吃();

three.跑();

three.跳();

就不用改了,你看的就是狗的吃,跑,跳了。

可能现在你不觉得有多方便,如果这个方法多了,继承Animal的多了,就体现出优势来了。

就是你赋值了three 对象是它的什么子类,展示方法的时候,就展示的是对应的子类的重写的方法。

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

  • 提问者 鱼儿0001 #1
    谢谢老师的回答。仔细的看了几遍,感觉。。。。我不懂你说的这句话:你发现了一个猫,然后你给这个猫在起了个代号 “two”,但是你当时心里没记住它具体是啥,就记住了它是动物,代号是two;--------老师你都说我发现了一只猫,我怎么会没记住它具体是啥,我都发现它是猫还能忘了?我不至于这么昏聩吧。。。Animal two=new Cat();这段代码我理解的是:父类Animal引用two指向子类Cat对象,因为two是父类引用,受限于这种身份,只能调用子类Cat继承自父类自己的方法,至于为什么能调用子类重写父类的方法,还是不理解。
    2019-05-07 15:13:44
  • 提问者 鱼儿0001 #2
    老师,好难懂,抽象的Animal two=new Cat();和奇怪的调用:two.猫的方法(),我觉得抽象的。。。。。
    2019-05-07 15:31:58
问题已解决,确定采纳
还有疑问,暂不采纳

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

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

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

在线咨询

领取优惠

免费试听

领取大纲

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