请解释一下下面的情况 输出是什么?
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;
}
}
最佳答案
完全严格地说,这不会编译,因为在第 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
.
当你执行强制转换时,就像你在说:“我是程序员,我知道这是一个......” ____(将你的类放在这里)
编译器将允许你编译。
但是,如果在运行时中,实例实际上并不是____(在本例中是E
,但实际上不是),那么它将抛出ClassCastException
。
程序不会因A a = ( B ) c
而失败;因为 c
是 C
的实例,而 C
是 B
的子类。
你可以说,C
是一个B
。为了更好地理解它,请考虑以下声明:
class Employee extends Object {
}
每个Employee
都是一个 对象
,因此转换会成功,实际上很明显它会成功,以至于您甚至不知道需要放置强制转换运算符()
。
Employee e = new Employee();
Object o = ( Object ) e; // or much better:
Object o2 = e; // no cast needed when assigning to superclass.
但对象
不一定是员工
。
Object o = ....
Employee e = ( Employee ) o; // will fail if o was not created as an Employee.
这就是 A a = ( E ) c;
失败的原因,因为引用 c
不是创建为 E
希望对您有所帮助。
关于java - 输出是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3032953/