老师可不可以帮我解释下下面这里的Aufruf 1, 2,3,5,9 的输出结果是什么?没怎么看懂

老师可不可以帮我解释下下面这里的Aufruf 1, 2,3,5,9 的输出结果是什么?没怎么看懂

正在回答 回答被采纳积分+1

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

3回答
好帮手慕阿莹 2020-02-21 13:48:54

同学你好,

首先解释一下为什么不是A中的g方法。

因为这里调用的是ab.u.g(42); 

也就是调用的u 这个对象的g()方法;

那u对象是谁呢?

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

根据 A的结构以及构造方法,我们可以看到是 

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

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

相当于

B u = new C();

按照同学的推理,应该是u调用g()方法的时候,应该显示的是C类中的g()方法呀

为啥会显示B类中的呢?

同学可能忽略了一个细节

如果C类中重写了父类的方法,则调用时,是调用子类的方法。

但是:

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

参数是不同的,所以,子类中根本就没有重写父类中的g()方法;

所以只能调用的是父类中的g()方法了。

如果同学存在疑惑,可以把C类中的g();方法的参数类型改为double 

就会输出C.g(int) 了。

如果我的回答解决了你的问题,请采纳,祝学习愉快.

好帮手慕小尤 2020-02-20 19:20:15

同学你好,在<>中 u继承了b,而U u就是U类的引用。如下图所示:

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

而<>是泛型,泛型本质上是提供类型的“类型参数”,也就是参数化类型。我们可以为类、接口或方法指定一个类型参数,通过这个参数限制操作的数据类型,从而保证类型转换的绝对安全。具体讲解,同学可学习《Java泛型》课程(http://class.imooc.com/course/995  )

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

好帮手慕小尤 2020-02-20 18:09:18

同学你好,1. 因为 U继承B而 B又继承A,在Poly类中U类可以调用a类与b类两个类中的方法,所以Aufruf 1与Aufruf 2通过ab引用调用U类再调用B类中的g()方法,输出B.g(double),

2. Aufruf 3通过ab引用调用A类中的g()方法,输出 A. g(double) 。

3. 而Poly类中ac引用强制转换为a类,所以Aufruf 5 调用A类中的g()方法,输出B.g(double)。

4. Poly类中ac引用强制转换为a类,所以调用两个参数的g(),则找不到此方法,导致编译性错误。如下图所示:

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

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

  • 提问者 慕仙7354812 #1
    老师,你说的poly类中的U类在哪里有体现,我怎么没看到啊? ab 是如何调用 u类? 我不太理解括号<>中里面的参数含义,这个括号与()有什么区别吗?
    2020-02-20 18:55:29
  • 提问者 慕仙7354812 #2
    为什么Aufruf 1 最终调用B类中的方法?而不是A类。 我的理解是:根据Java在的规定,非静态类应该调用的是子类,因为B类继承A类,所以调用B是A的子类,但是同时C又是B的子类,为什么结果不是 C.g(int) ?
    2020-02-20 19:34:20
问题已解决,确定采纳
还有疑问,暂不采纳

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

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

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

在线咨询

领取优惠

免费试听

领取大纲

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