【问题标题】:Versions of inheritance in java with castingjava中带有强制转换的继承版本
【发布时间】:2018-03-18 12:00:49
【问题描述】:

我对下面的练习有点困惑,并没有用搜索功能找到那种问题。

鉴于以下情况,这些替代方案中的哪些是可执行的:

class Animal
class Dog extends Animal   //Dog is an extension of Animal

我们想将Dog 类的对象分配给Animal 类型的变量:

(1) Animal t = new Object();
(2) Animal t = (Dog) (new Object());
(3) Animal t = new Dog();
(4) Animal t = (Dog) new Class();
  1. 错误 : 是错误的,因为它与狗无关。
  2. good : Object 是 Dog 的上类,我们将它转​​换为 Dog,它扩展了 animal,所以没关系。
  3. :没关系,因为每只狗都是动物。
  4. 错误 : new Class 没有被拒绝,所以它是错误的。

我的推理对吗?感谢您的每一次帮助。

【问题讨论】:

  • 你可以很容易地测试这个,不是吗?
  • 我不会回答你的问题,但你要搜索的神奇关键字是java polymorphism
  • 对象的类别是对象本身的品质。无论你将它转换成什么,你都不会改变对象的类,只是你的代码如何选择查看该类。如果您创建的对象不是继承自 Animal 的类,则强制转换不会使其成为 Animal。
  • @OHGODSPIDERS 这仅适用于 Object 还是generell?,例如。 G。动物A =(狗)新宠物(); Dog 扩展 Pet 和 Pet 扩展 Animal 的地方在哪里?
  • @PeterPan 您只能转换为对象实际存在的东西。铸造不会“转换”任何东西,它只会改变现有对象的处理方式。因此,您可以将 Dog 投射到 Animal 上,但不能反过来。但是,您可以执行以下操作:Object obj = new Dog(); Dog dog = (Dog) obj; 因为 obj 已经是 Dog 并且仅分配给 Object 类型的变量。

标签: java inheritance casting


【解决方案1】:

没有尝试过,但我认为:

(1) Animal t = new Object(); 

无效 - Object 不是 Animal - 不会编译

(2) Animal t = (Dog) (new Object());

无效 - Object 不是 Animal - 将编译但会在运行时失败

(3) Animal t = new Dog();

很好 - DogAnimal

(4) Animal t = (Dog) new Class();

这与 (2) 相同 - 你确定你抄对了吗?

【讨论】:

  • 是的,我做到了。这可能是比较简单的问题之一,但我很困惑,尤其是 (2) 和 (3)。谢谢你。
猜你喜欢
  • 1970-01-01
  • 2017-06-16
  • 2021-11-28
  • 1970-01-01
  • 2012-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多