JAVA类层次结构:以下哪一行不会编译?
具有以下类层次结构:JAVA类层次结构:以下哪一行不会编译?,java,compiler-errors,hierarchy,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; /
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
我认为第五行:因为卷毛狗和狗的静电束缚
第8行:只有静态绑定与赋值相关
我说得对吗?你能解释一下吗 你说得对,语句5和8将失败 5> 不能将父类“对象”分配给子类“ref变量”。狮子狗绝对是狗。但是狗可能不是狮子狗 8> 第8行也是如此。不过,这没关系:
dog2=(狗)拉布拉多代码>
注意:在第8行进行显式的类型转换是可以的,因为拉布拉多是拉布拉多的对象,拉布拉多又是狗的一个子类。如果你在(5)的情况下也这么做,比如
它会编译,但在运行时会失败——原因很简单——dog
指的是拉布拉多犬dog.getClass()
将返回Labrador.class
。对于任何ref引用的对象,ref应该是属于对象原始类的向上层次结构的类/接口的ref。拉布拉多犬虽然是狗,但绝对不是贵宾犬
另外,第2行的显式类型转换也不是很有用,因为它是隐式完成的。以下是需要显式typecase的地方:
Dog d = new Labrador();
Labrador lbd = (Labrador) d;
讲师问你这个问题的目的是让你根据研究结果来回答。让别人替你回答不是研究。即使你发布了你自己的部分答案。这是为了测试评论。添加到TJ的评论中,你也可以尝试编译代码,然后查看失败的地方和出现的错误。你是对的,它是5。我不确定这里是否有一个有意义的答案,所以你可能想删除这个问题。毕竟,您的讲师可能对堆栈溢出并不陌生:-)我还说了第8行:这也对吗?为什么第5行没有强制转换会有帮助?添加了一些编辑。这应该对你有帮助。为什么有人会否决我的答案P如果你这样做的话,至少要谦虚地加上一条评论。谢谢!“ref”代表什么?引用变量。您可以使用类本身或父类的引用变量引用类的对象。如果您是java程序员,它们绝对是必须的。有关静态和动态绑定的概念将在后面介绍。
Dog d = new Labrador();
Labrador lbd = (Labrador) d;