V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
ENNRIaaa
V2EX  ›  Java

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

  •  
  •   ENNRIaaa · 2020-07-02 12:23:40 +08:00 · 2151 次点击
    这是一个创建于 476 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

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

    22 条回复    2020-07-03 12:32:03 +08:00
    Licsber
        1
    Licsber   2020-07-02 12:39:35 +08:00
    abcd
    Licsber
        2
    Licsber   2020-07-02 12:41:02 +08:00
    多态没学好吧 b 是典型的考试例题

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

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

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

    也可以在 d 上调用啊

    这出题目怕是小学没毕业,他想表达的是 “在 c 上只能调用 Collection 接口中声名的方法”,但这样还是不对,在 c 上也可以调用在 Object 和 Iterable 中声明的方法啊。。。
    ENNRIaaa
        10
    ENNRIaaa   2020-07-02 17:08:34 +08:00
    @lululau 可能是玩文字游戏把,搞不懂
    ENNRIaaa
        11
    ENNRIaaa   2020-07-02 17:10:07 +08:00
    @Licsber 答案是 ACD,我选了 ABCD,始终没想明白 B 怎么错了,就过来问问
    ychost
        12
    ychost   2020-07-02 17:14:29 +08:00
    B 错了,对象 c 不仅能掉 Collection 的方法,还能调用 ArrayList 的方法,((ArrayList)c).indexOf(o)
    Tenma
        13
    Tenma   2020-07-02 17:16:19 +08:00
    我也认为 ABCD,因为如果如果考虑特殊方式的话,很多看起来正确的都是错误的,就如同 private 的访问权限一样,用反射的话,也可以被访问。
    maninfog
        14
    maninfog   2020-07-02 17:21:17 +08:00 via Android
    同意 9 楼
    ENNRIaaa
        15
    ENNRIaaa   2020-07-02 17:39:05 +08:00
    @ychost 可能出题者的意思真的是这样把,通过强转
    NotFoundEgg
        16
    NotFoundEgg   2020-07-03 08:28:55 +08:00 via Android
    这题目文字游戏 b 咋说咋有理 它甚至还能说可以调用 Object 里的方法呢
    thinkingInJava
        17
    thinkingInJava   2020-07-03 09:21:50 +08:00
    这题真 zz,有这功夫玩文字游戏,不如出个引用传递值传递来的精髓
    thinkingInJava
        18
    thinkingInJava   2020-07-03 09:25:04 +08:00
    真纠结文字游戏,A 创建了实际对象,单一个实际对象吗? super()怎么说?
    TtTtTtT
        19
    TtTtTtT   2020-07-03 10:20:53 +08:00
    @Licsber
    emm,首先,并不是什么都能反射,你不能通过反射调用其他类的方法,强制类型转换也是如此。
    多态并不意味着对象的类型被修改,而是给予开发者一个一致的模式来处理类似的逻辑。
    在 c 上调用,指的是是否能通过一个基类的引用,调用到子类的方法。
    否则,为什么不问"只能在 c 上通过 c.someMethod()的方式调用 collection 接口中声明的方法"。
    Licsber
        20
    Licsber   2020-07-03 11:36:18 +08:00
    @TtTtTtT #19 是我表述不太完整 运行期的任何东西理论上都能通过反射取到
    所以这题的 b 你的答案是错误的么? 我还是坚持我#1 楼的看法 同意#13 楼的看法
    另外可能真像#9 楼讲的 出题人瞎搞 就是文字游戏 确实 zz 没有什么讨论必要
    你的表述跟我#2 楼的表述是不一致的 这题应该就是想要考多态 但是被玩成了文字游戏
    你的表述是 我可以用这个引用 c 来做*任何事情* 问能不能访问到具体子类的方法 那答案当然是可以
    但是这很明显就是纯粹坑人了 参照其他选项 不考多态 考反射 不合常理
    goodboy95
        21
    goodboy95   2020-07-03 11:50:20 +08:00
    说实话我也看不懂 B 是啥意思,如果真的尊重原文的话,那我就可以说“我可以再建一万个基于 Collection 的对象,每个对象上都可以调用 Collection 的方法”,但这句话总有种扯犊子的感觉
    TtTtTtT
        22
    TtTtTtT   2020-07-03 12:32:03 +08:00
    @Licsber
    我明白了,你认为这道题目的考察是多态。
    我个人的理解是,多态并没有要求 c 只能调用 collection 的方法,只是说 c 可以调用 collection 的方法,collection 的方法由子类分别实现。
    到具体的实现,就是可以用反射也可以用强制类型转换来获取运行时的具体子类。
    关于   ·   帮助文档   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1243 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 54ms · UTC 18:20 · PVG 02:20 · LAX 11:20 · JFK 14:20
    ♥ Do have faith in what you're doing.