引用类型的类型转换
首先定义几个类他们的继承关系如下:
在图中的 B->A 表示 B继承A
向上转型
结论:子类可以自动转型为父类 即父类容器可以接收子类对象
//首先是类型转换
A a = new D();
向下转型
结论:父类转型为子类时候需要强制转换
但是有限制!注意下边的 “不可以” 情况可能编译会通过,但是运行会出错,要多实践
//可以
A a = new D();
D d = (D)a;
C c = (C)a;//同理这个也可以 C是D的父类也可以接收D对象
//不可以
C c =new A();
//同理下边这个也不可以
A a=new C();
D d = (D)a;//虽然有关系 但是D是C的子类 和上边错误一样
//不可以
A a =new B();
E e =(E)a; //因为 BE 没有关系
//可以
B b =new C();
A a =b;
结论:父类转型为子类时候需要强制转换
但是限制如下:
- 首先转化时候需要有继承关系。继承没有兄弟姐妹大伯二叔的关系。只有 爸!
- 转化的类型必须是对象创建类的本身或者父类。
如何判断能否转化?
使用 instanceof 关键字 ,用于在运行时确定一个对象是否是某个类的实例,或者是其子类的实例。
语法:对象 instanceof 类
直白的也就是说判断 此 实际创建对象类 是不是 判断的类 或者 其子类。能true不能false
如果 对象现在属于的类 和 判断的类没关系则报错
C c=new C();
System.out.println(c instanceof C); //true
System.out.println(c instanceof A); //true
System.out.println(c instanceof E); //报错
System.out.println(c instanceof F); //false
System.out.println(c instanceof M); //报错
A a=new C();
System.out.println(a instanceof C); //true
System.out.println(a instanceof A); //true
System.out.println(a instanceof E); //false A 和 E有关系
System.out.println(a instanceof F); //false
System.out.println(a instanceof M); //false A 和 E有关系