请在下面解释一下情况 什么是输出?
interface A{}
class B implements A{}
class C extends B{}
class D extends C{}
class E extends D{
public static void main(String args[]){
C c = new C();
B b = c;
A a = (E)c;
a = (B)c;
c = (C)(B)c;
}
}
答案 0 :(得分:4)
完全严格,“不会编译,因为在第4行,您输入Class
而不是class
Class D extends C{}
稍后您定义两次a
和c
C c = new C(); // once
B b = c;
A a = (E)c; // once a
A a = (B)c; // twice c
C c = (C)(B)c; // twice
现在假设这些是拼写错误,输出结果为ClassCastException
,因为c
无法投放到E
。
当你执行演员表时就像你说的那样:“我是程序员,我知道这是......” ____(put your class here)
编译器允许你编译。
但是如果在运行时中,实例实际上不是____(在这种情况下是E
,而不是),那么它将抛出ClassCastException
。
程序不会因A a = ( B ) c
而失败;因为c
是C
的一个实例,它是B
的子类。
您可以这么说,C
是B
。要理解它,最好考虑以下声明:
class Employee extends Object {
}
每个Employee
都是 Object
,所以演员阵容会成功,实际上它是如此明确以至于你甚至不需要把演员算子放到()
。
Employee e = new Employee();
Object o = ( Object ) e; // or much better:
Object o2 = e; // no cast needed when assigning to superclass.
但Object
不一定是Employee
。
Object o = ....
Employee e = ( Employee ) o; // will fail if o was not created as an Employee.
这就是A a = ( E ) c;
失败的原因,因为参考c
不创建为E
我希望有所帮助。
答案 1 :(得分:1)
A a =(E)c;
的ClassCastException答案 2 :(得分:1)
如果没有实际尝试,我会说出这条线会导致两个编译器错误:
C c = (C)(B)c;
如果你真的把这样的双重演员投入到一个真实的项目中,那么你应该得到你的屁股踢。
答案 3 :(得分:1)
对象c被创建为新的C.由于C扩展B,将它分配给类型B的变量没有问题。但是C对E一无所知,所以你不能在这里进行转换。你只能用超类来做这件事。由于A是绝对顶级,因此可以将已定义类型的任何对象分配给它。
答案 4 :(得分:0)
我认为没有输出。因为你没有告诉它入口点在哪里。
如果 将主类指定为 D E,则仍然没有输出,因为所有这些类都扩展了一个空类。