这是我自己在做练习时遇到的问题,一时间没想明白,分享出来。
public class A {//定义一个类A
public void a() {
System.out.println("this is A's");
};
}
public class B extends A{//定义一个类B继承了A
public void b() {
System.out.println("this is B's");
}
}
下面分析一种错误的向下转型方式,以及错误的原因。
public class Test {
public static void main(String[] args) {
A a = new B();
a = (B)a;//这里虽然a先被转换为B的引用,但是在赋值操作时,因为a的类型是A,这个等号右边的表达式整体又被自动转换为A类型。
a.b();//这一行编译不通过,由于上述原因,这里a依然不能使用B中的方法。
}
}
正确的方式应该是如下。
public class Test {
public static void main(String[] args) {
A a = new B();
B b = (B)a;//需要再声明一个B类的引用来接收这个强制转换的结果。
b.b();
}
}
本文深入探讨Java中对象的向下转型过程及常见错误。通过具体代码示例,解析了为何直接在基类引用上调用子类方法会导致编译错误,并给出了正确的实现方式。
663

被折叠的 条评论
为什么被折叠?



