gpt4 book ai didi

java - OOP、接口(interface)、对象和转换

转载 作者:行者123 更新时间:2023-12-03 23:05:32 25 4
gpt4 key购买 nike

我正在查看一些过去的 OOP 试卷,如果能帮助我理解以下代码,我将不胜感激。问题是,鉴于这第一段代码和 Sandwich 实现了 Edible,以下哪些陈述是合法的?

Sandwich sub = new Sandwich();
Rectangle cerealBox = new Rectangle(20,30,20,10);
Edible e = null;

e = sub;
sub = e;
sub = (Sandwich) e;
sub = (Sandwich) cerealBox;
e = cerealBox;
e = (Edible) cerealBox;
e = (Rectangle) cerealBox;
e = (Rectangle) null;
e = (Edible) sub;
cerealBox = (Rectangle) new Object();

我目前的理解是,第一个陈述是正确的,因为 sub 具有构成可食用对象所需的元素,因此它不适用于第二个陈述。并且第三个语句转换确实允许这个工作。但是第四个不是因为 cerealBox 不适用于三明治。然后最后两个因为类型转换而起作用。但显然第 6 个有效?

抱歉,我对我所知道的内容做出了糟糕的解释,我们将不胜感激。

最佳答案

据说 Java 中的继承和接口(interface)实现表示“is-a”关系。也就是说,如果 Boy 继承自 Person,那么 Boy 就是一个 Person。因此,它可以被视为 Person(因为它确实是)。这特别意味着它可以分配给 Person 类型的实例。

有了这个,我们可以决定

  1. e = sub 编译并运行良好。 [确定]
  2. 另一方面,
  3. sub = e 无法编译:is-a 关系无法逆转。 [!]
  4. sub = (Sandwich) e forces 上述代码通过显式转换进行编译。此外,由于 e 在那一点 确实 包含一个三明治(来自赋值 1),因此此转换在运行时也会成功。 [确定]
  5. sub = (Sandwich) cerealBox - 由于没有从 RectangleSandwich 的有意义的转换,因此编译失败。 [!]
  6. e = cerealBox – 此处相同,原因大致相同。 [!]
  7. e = (Edible) cerealBox 在这里,Java 编译器投降了:它允许强制转换,即使我们(程序员)知道它不会成功,因为包含在cerealBox 没有实现 Edible – 但编译器不知道这一点:可以想象,其中包含的对象可以从 Rectangle 派生(因此可分配给 cerealBox),并且实现Edible

    所以编译器默认了。但是在运行时,你会得到一个 ClassCastException

    请注意此语句与 4 的不同之处:在那里,编译器知道 cerealBox 不能包含 Sandwich。但它可能包含一些可食用的东西。为什么?因为 Java 是单继承的(Rectangle 不继承自 Sandwich),但允许从多个接口(interface)扩展。 [C]

  8. e = (Rectangle) cerealBox 失败,因为强制转换实际上完全没有意义(cerealBox 已经是 Rectangle 类型),其余的语句等同于 5.[!]
  9. e = (Rectangle) null 失败,即使 null 可以 分配给 Edible 对象。但是由于与 5 无效相同的原因,强制转换使它无效。 [!]
  10. e = (Edible) sub 是有效的,并且等价于 1。然而,转换是完全多余的,因为 Java 在继承层次结构中隐式向上执行转换。 [确定]
  11. cerealBox = (Rectangle) new Object() 编译,并在运行时崩溃。原因类似于6:ObjectRectangle的基类;因此,一个对象可以包含一个Rectangle 实例,这将使该语句成功(有关示例,请参见 3)。

    没错,编译器有点蠢——它可以看到被转换的对象——new Object()——绝不可能是一个Rectangle 。但是编译器不做这个分析,因为在一般情况下这是不可能的。 [C]

关键:[OK] = 编译,运行无错。 [C] = 编译,崩溃。 [!] = 不编译。

如您所见,哪些语句是“合法”的问题并没有解决这个问题:其中一些语句可以编译,但会在运行时产生异常。它们合法吗?

关于java - OOP、接口(interface)、对象和转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10588645/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com