什么是输出?

时间:2010-06-13 16:20:08

标签: java inheritance

请在下面解释一下情况 什么是输出?


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;
}
}

5 个答案:

答案 0 :(得分:4)

完全严格,“不会编译,因为在第4行,您输入Class而不是class

Class D extends C{}

稍后您定义两次ac

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而失败;因为cC的一个实例,它是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;
  1. 你两次声明变量'c'。
  2. 您无法从B转换为C.
  3. 如果你真的把这样的双重演员投入到一个真实的项目中,那么你应该得到你的屁股踢。

答案 3 :(得分:1)

对象c被创建为新的C.由于C扩展B,将它分配给类型B的变量没有问题。但是C对E一无所知,所以你不能在这里进行转换。你只能用超类来做这件事。由于A是绝对顶级,因此可以将已定义类型的任何对象分配给它。

答案 4 :(得分:0)

我认为没有输出。因为你没有告诉它入口点在哪里。

如果 将主类指定为 D E,则仍然没有输出,因为所有这些类都扩展了一个空类。