JAVA class hierarchy: 下面哪一行不能编译?

JAVA class hierarchy: Which of the following lines will not compile?

具有以下 class 层次结构:

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 行:只有静态绑定与赋值相关。

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

你是对的,语句 5 和 8 将会失败。

5> 您不能将父 class' 对象分配给子 class' ref 变量。 贵宾犬绝对是狗。但是狗不一定是贵宾犬。

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

注意:在第 8 行中完成的显式类型转换是可以的,因为 labrador 是 Labrador 的对象,它进一步是 Dog 的子class。如果你尝试在(5)的情况下做同样的事情,比如

poodle = (Poodle)dog;

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

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

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