我在java中有两个类:
class A {
int a=10;
public void sayhello() {
System.out.println("class A");
}
}
class B extends A {
int a=20;
public void sayhello() {
System.out.println("class B");
}
}
public class HelloWorld {
public static void main(String[] args) throws IOException {
B b = (B) new A();
System.out.println(b.a);
}
}
在编译时它不会给出错误,但在运行时它会显示错误: 线程“main”中的异常java.lang.ClassCastException:A不能转换为B
答案 0 :(得分:16)
这是因为new A()
的编译时表达式类型为A
- 可能是B
实例的引用1}},所以允许施法。
但是,在执行时,引用仅仅是A
的实例 - 因此它无法进行转换。仅A
的实例不是 B
的实例。仅当引用确实引用B
或子类的实例时,该转换才有效。
答案 1 :(得分:7)
B扩展A,因此B可以转换为A.但反之则不然。 A的实例不能转换为B。
如果您来自Javascript世界,您可能希望这可以工作,但Java没有“duck typing”。
答案 2 :(得分:1)
首先这样做:
A aClass = new B();
现在进行显式投射,它将起作用:
B b = (B) aClass;
这意味着明确的演员必须要隐式演员。 elsewise不允许显式转换。
答案 3 :(得分:0)
创建子类的对象后,无法将其类型转换为superClass。请看下面的例子
<强>假设:强> Dog是继承自Animal(SuperClass)
的子类普通的Typecast:
Dog dog = new Dog();
Animal animal = (Animal) dog; //works
错误的Typecast:
Animal animal = new Animal();
Dog dog = (Dog) animal; //Doesn't work throws class cast exception
下面的Typecast确实有效:
Dog dog = new Dog();
Animal animal = (Animal) dog;
dog = (Dog) animal; //This works
编译器检查运行时实际验证内容的语法