62,614
社区成员
发帖
与我相关
我的任务
分享
class A {
}
class B extends A {
}
public class Test {
public void main(String[] args) {
A a = new A(); //a是A类型的变量,它引用一个A对象
B b = new B(); //b是B类型的变量,它引用一个B对象
A aa = b; //这里是向上转换,aa是A类型的变量,b是B类型的变量,
//把b所引用的B类型的对象转换成A类型的对象,然后让aa引用这个对象
B bb = (B)aa; //这里是向下转换,bb是B类型的变量,aa是A类型的变量
//把aa所引用的A类型的对象转换成B类型的对象,然后让bb引用这个对象
}
}
向上转换和向下转换的区别就是,向上转换不需要强行转换(JVM自动隐式转换),也不会出错,因为父类对象的空间比子类对象的空间小,所以把子类转换成父类不会造成内存访问的危险,而反过来,父类转换成子类,因为父类对象的空间理论上比子类对象的空间小(父类对象的实际内存空间可能和子类一样,也就是父类引用子类对象的情况),所以会造成内存访问的危险,所以要自己强行转换(手动显式转换),也就是用户自己确保安全以后自己转换,如果实际的父类对象的空间不符合子类对象的空间(也就是转成子类所需要的空间超出了父类对象的实际内存空间,造成内存访问越界),那么就会转换失败,JVM会抛出异常