我收到以下代码的异常。
class A {
void foo() {
System.out.println("Running foo()");
}
}
class B extends A {
void foo() {
System.out.println("Overidden foo()");
}
}
public class Casting {
public static void main(String[] args) {
A obj = new B();
obj.foo();
// B ref = (B) obj;
// ref.foo();
B ref = (B) new A();
ref.foo();
}
}
但是如果我运行
B ref = (B) obj;
ref.foo();
而不是
B ref = (B) new A();
ref.foo();
它工作正常。
谁能解释一下这里发生了什么?
最佳答案
obj
是 B
的实例,因为您使用类 B
的构造函数创建了它。这就是为什么 B ref = (B) obj;
工作正常的原因。
在 B ref = (B) new A();
中,您只需转换使用 A
的构造函数创建的 A
类型的对象> (这是父类)到子类类型,这将导致 java.lang.ClassCastException
。相反的转换也可以,即
A ref = (A) new B();
ref.disp();
在这种情况下,您可以将子类的实例转换为其父类,这很好,因为 B
类型的对象也是 A
的实例。
关于java - 类/对象转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24386325/