简单地说 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会抛出异常
对象类型转换运用 比如说 在控制台以字符串(String)接收"1.231",此时你想把"1.231"变为数值型是就要使用转换Integer.parseInt();
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会抛出异常