针对代码: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 ![]() 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 的方法”,但这句话总有种扯犊子的感觉 |