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;
具有以下 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;