JAVA类层次结构:以下哪行不能编译?

时间:2016-06-25 10:41:07

标签: java compiler-errors hierarchy

具有以下类层次结构:

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

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

1 个答案:

答案 0 :(得分:0)

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

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

8是氢。第8行也是如此。但是,这没关系:poodle = (Poodle)dog;

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

dog

它会编译,但会在运行时失败 - 因为简单的原因 - dog.getClass()指的是拉布拉多。 Labrador.class将返回Dog d = new Labrador(); Labrador lbd = (Labrador) d; 。对于任何ref引用的此对象,ref应该是属于对象原始类的向上层次结构的类/接口的ref。 拉布拉多虽然是一只狗,但绝对不是狮子狗。

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

element(by.buttonText('Decline')).click();
browser.sleep(2000);
element(by.cssContainingText('.btn', 'Decline')).click();