【问题标题】:JAVA class hierarchy: Which of the following lines will not compile? [closed]JAVA 类层次结构:以下哪几行不会编译? [关闭]
【发布时间】:2016-10-27 21:48:58
【问题描述】:

具有以下类层次结构:

Interface Animal {…}
class Dog implements Animal{…}
class Poodle extends Dog {…}
class Labrador extends Dog {…}

以下哪几行不会编译?

Poodle poodle = new Poodle(); //1
Animal animal = (Animal) poodle; //2
Dog dog = new Labrador(); //3
animal = dog; //4
poodle = dog; //5
Animal labrador = new Labrador(); //6
Dog dog2 = new Labrador(); //7
dog 2=labrador;//8

我认为第 5 行:因为贵宾犬和狗的静态绑定。

第 8 行:只有静态绑定与分配相关。

我说的对吗?你能解释一下吗?

【问题讨论】:

  • 教练问你这个问题的目的是让根据研究来回答。要求其他人为您回答不是研究。即使您发布自己的部分答案。
  • 测试复习用
  • 要添加到 TJ 的评论中,您可以尝试编译代码,然后查看失败的原因以及遇到的错误。
  • 你是对的,它是 5。我不确定这里是否有有意义的答案,所以你可能想删除这个问题。毕竟,您的讲师可能对 Stack Overflow 并不陌生 :-)
  • 我也说了第8行:是不是也对?

标签: java compiler-errors hierarchy


【解决方案1】:

你是对的,陈述 5 和 8 将失败。

5> 不能将父类的对象分配给子类的 ref 变量。 贵宾犬绝对是狗。但是狗可能不是贵宾犬。

8> 第 8 行也是如此。但是,这没关系:dog2= (Dog)labrador;

注意:在第 8 行中进行的显式类型转换是可以的,因为拉布拉多是拉布拉多的对象,拉布拉多是狗的一个子类。如果你尝试在 (5) 的情况下做同样的事情,比如

poodle = (Poodle)dog;

它会编译,但在运行时会失败 - 原因很简单 - dog 指的是拉布拉多犬。 dog.getClass() 将返回 Labrador.class。对于要由任何 ref 引用的该对象,该 ref 应该是属于该对象原始类的向上层次结构的类/接口的引用。 拉布拉多虽然是狗,但绝对不是贵宾犬。

另外,第 2 行的显式类型转换不是很有用,因为它是隐式完成的。以下是需要显式类型的地方:

Dog d = new Labrador();
Labrador lbd = (Labrador) d;

【讨论】:

  • 为什么没有强制转换对第 5 行有帮助?
  • 添加了一些修改。这应该可以帮助你。为什么有人会否决我的答案? :P 如果您这样做的话,至少可以谦虚地添加评论..
  • 谢谢! 'ref' 代表什么?
  • 参考变量。您可以使用自身或父类的引用变量来引用类的对象
  • 学习java中多态的概念。如果您是 Java 程序员,它们绝对是必须的。关于静态和动态绑定的概念在后面介绍。
猜你喜欢
  • 2013-12-06
  • 2011-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-06
  • 1970-01-01
  • 2012-01-21
相关资源
最近更新 更多