提问个问题,没整明白 [针对代码: Collection c = new ArrayList(),以下哪些您认为是正确的]

2020-07-02 12:23:40 +08:00
 ENNRIaaa

针对代码:Collection c = new ArrayList(),以下哪些您认为是正确的:

A 、new ArrayList()创建了实际的对象

B 、只能在 c 上调用 Collection 接口中声名的方法

C 、它创建了引用 c 指向实际创建的 ArrayList 对象

D 、Collection c 只是定义了实例的引用

多选,主要是比较纠结 B 这个选项是对还是错的

2993 次点击
所在节点    Java
22 条回复
Licsber
2020-07-02 12:39:35 +08:00
abcd
Licsber
2020-07-02 12:41:02 +08:00
多态没学好吧 b 是典型的考试例题

“当超类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法。 在 Java 中有两种形式可以实现多态。 继承和接口。”
RedBeanIce
2020-07-02 13:44:09 +08:00
ACD 都是一样的,考的是堆栈,B 考的是啥呢,考的是继承和多态吧

彩笔的我,想了大概一分钟才想清楚。。我第一眼也看不出来,记不住
TtTtTtT
2020-07-02 14:00:59 +08:00
B,我个人认为是错的。

因为,尽管 c 作为引用是 Collection 类型的,但实际上也可以调用 ArrayList 的方法,包括但不限于通过反射,强制类型转换等方式。
miaeLKK
2020-07-02 14:09:59 +08:00
实践一下,b 是对的。其实也不难理解,我有个鸟,但我只说我有个东西(引用类型东西),别人只知道我有个“东西”,不知道具体是啥,所以别人不能知道这个东西会飞。
ENNRIaaa
2020-07-02 16:20:43 +08:00
@Licsber 我选了 B,确是错的,真是想不通
Licsber
2020-07-02 16:26:18 +08:00
@TtTtTtT #4 啥东西理论上都能反射 那这样就没必要出题考你语言特性了 这是 OOP 最基本的特性
强转肯定是错的 题目明确说了在 c 上调用
Licsber
2020-07-02 16:26:49 +08:00
@ENNRIaaa #6 答案给出 b 是错的? 那答案错了
lululau
2020-07-02 16:32:47 +08:00
Collection d = c

也可以在 d 上调用啊

这出题目怕是小学没毕业,他想表达的是 “在 c 上只能调用 Collection 接口中声名的方法”,但这样还是不对,在 c 上也可以调用在 Object 和 Iterable 中声明的方法啊。。。
ENNRIaaa
2020-07-02 17:08:34 +08:00
@lululau 可能是玩文字游戏把,搞不懂
ENNRIaaa
2020-07-02 17:10:07 +08:00
@Licsber 答案是 ACD,我选了 ABCD,始终没想明白 B 怎么错了,就过来问问
ychost
2020-07-02 17:14:29 +08:00
B 错了,对象 c 不仅能掉 Collection 的方法,还能调用 ArrayList 的方法,((ArrayList)c).indexOf(o)
Tenma
2020-07-02 17:16:19 +08:00
我也认为 ABCD,因为如果如果考虑特殊方式的话,很多看起来正确的都是错误的,就如同 private 的访问权限一样,用反射的话,也可以被访问。
maninfog
2020-07-02 17:21:17 +08:00
同意 9 楼
ENNRIaaa
2020-07-02 17:39:05 +08:00
@ychost 可能出题者的意思真的是这样把,通过强转
NotFoundEgg
2020-07-03 08:28:55 +08:00
这题目文字游戏 b 咋说咋有理 它甚至还能说可以调用 Object 里的方法呢
thinkingInJava
2020-07-03 09:21:50 +08:00
这题真 zz,有这功夫玩文字游戏,不如出个引用传递值传递来的精髓
thinkingInJava
2020-07-03 09:25:04 +08:00
真纠结文字游戏,A 创建了实际对象,单一个实际对象吗? super()怎么说?
TtTtTtT
2020-07-03 10:20:53 +08:00
@Licsber
emm,首先,并不是什么都能反射,你不能通过反射调用其他类的方法,强制类型转换也是如此。
多态并不意味着对象的类型被修改,而是给予开发者一个一致的模式来处理类似的逻辑。
在 c 上调用,指的是是否能通过一个基类的引用,调用到子类的方法。
否则,为什么不问"只能在 c 上通过 c.someMethod()的方式调用 collection 接口中声明的方法"。
Licsber
2020-07-03 11:36:18 +08:00
@TtTtTtT #19 是我表述不太完整 运行期的任何东西理论上都能通过反射取到
所以这题的 b 你的答案是错误的么? 我还是坚持我#1 楼的看法 同意#13 楼的看法
另外可能真像#9 楼讲的 出题人瞎搞 就是文字游戏 确实 zz 没有什么讨论必要
你的表述跟我#2 楼的表述是不一致的 这题应该就是想要考多态 但是被玩成了文字游戏
你的表述是 我可以用这个引用 c 来做*任何事情* 问能不能访问到具体子类的方法 那答案当然是可以
但是这很明显就是纯粹坑人了 参照其他选项 不考多态 考反射 不合常理

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/686518

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX