针对代码:Collection c = new ArrayList(),以下哪些您认为是正确的:
A 、new ArrayList()创建了实际的对象
B 、只能在 c 上调用 Collection 接口中声名的方法
C 、它创建了引用 c 指向实际创建的 ArrayList 对象
D 、Collection c 只是定义了实例的引用
多选,主要是比较纠结 B 这个选项是对还是错的
1
Licsber 2020-07-02 12:39:35 +08:00
abcd
|
2
Licsber 2020-07-02 12:41:02 +08:00
多态没学好吧 b 是典型的考试例题
“当超类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法。 在 Java 中有两种形式可以实现多态。 继承和接口。” |
3
RedBeanIce 2020-07-02 13:44:09 +08:00
ACD 都是一样的,考的是堆栈,B 考的是啥呢,考的是继承和多态吧
彩笔的我,想了大概一分钟才想清楚。。我第一眼也看不出来,记不住 |
4
TtTtTtT 2020-07-02 14:00:59 +08:00
B,我个人认为是错的。
因为,尽管 c 作为引用是 Collection 类型的,但实际上也可以调用 ArrayList 的方法,包括但不限于通过反射,强制类型转换等方式。 |
5
miaeLKK 2020-07-02 14:09:59 +08:00 via Android
实践一下,b 是对的。其实也不难理解,我有个鸟,但我只说我有个东西(引用类型东西),别人只知道我有个“东西”,不知道具体是啥,所以别人不能知道这个东西会飞。
|
7
Licsber 2020-07-02 16:26:18 +08:00
@TtTtTtT #4 啥东西理论上都能反射 那这样就没必要出题考你语言特性了 这是 OOP 最基本的特性
强转肯定是错的 题目明确说了在 c 上调用 |
9
lululau 2020-07-02 16:32:47 +08:00 2
Collection d = c
也可以在 d 上调用啊 这出题目怕是小学没毕业,他想表达的是 “在 c 上只能调用 Collection 接口中声名的方法”,但这样还是不对,在 c 上也可以调用在 Object 和 Iterable 中声明的方法啊。。。 |
12
ychost 2020-07-02 17:14:29 +08:00
B 错了,对象 c 不仅能掉 Collection 的方法,还能调用 ArrayList 的方法,((ArrayList)c).indexOf(o)
|
13
Tenma 2020-07-02 17:16:19 +08:00
我也认为 ABCD,因为如果如果考虑特殊方式的话,很多看起来正确的都是错误的,就如同 private 的访问权限一样,用反射的话,也可以被访问。
|
14
maninfog 2020-07-02 17:21:17 +08:00 via Android
同意 9 楼
|
16
NotFoundEgg 2020-07-03 08:28:55 +08:00 via Android
这题目文字游戏 b 咋说咋有理 它甚至还能说可以调用 Object 里的方法呢
|
17
thinkingInJava 2020-07-03 09:21:50 +08:00
这题真 zz,有这功夫玩文字游戏,不如出个引用传递值传递来的精髓
|
18
thinkingInJava 2020-07-03 09:25:04 +08:00
真纠结文字游戏,A 创建了实际对象,单一个实际对象吗? super()怎么说?
|
19
TtTtTtT 2020-07-03 10:20:53 +08:00
@Licsber
emm,首先,并不是什么都能反射,你不能通过反射调用其他类的方法,强制类型转换也是如此。 多态并不意味着对象的类型被修改,而是给予开发者一个一致的模式来处理类似的逻辑。 在 c 上调用,指的是是否能通过一个基类的引用,调用到子类的方法。 否则,为什么不问"只能在 c 上通过 c.someMethod()的方式调用 collection 接口中声明的方法"。 |
20
Licsber 2020-07-03 11:36:18 +08:00
@TtTtTtT #19 是我表述不太完整 运行期的任何东西理论上都能通过反射取到
所以这题的 b 你的答案是错误的么? 我还是坚持我#1 楼的看法 同意#13 楼的看法 另外可能真像#9 楼讲的 出题人瞎搞 就是文字游戏 确实 zz 没有什么讨论必要 你的表述跟我#2 楼的表述是不一致的 这题应该就是想要考多态 但是被玩成了文字游戏 你的表述是 我可以用这个引用 c 来做*任何事情* 问能不能访问到具体子类的方法 那答案当然是可以 但是这很明显就是纯粹坑人了 参照其他选项 不考多态 考反射 不合常理 |
21
goodboy95 2020-07-03 11:50:20 +08:00
说实话我也看不懂 B 是啥意思,如果真的尊重原文的话,那我就可以说“我可以再建一万个基于 Collection 的对象,每个对象上都可以调用 Collection 的方法”,但这句话总有种扯犊子的感觉
|