父类转子类
- 父类强转子类的要求:父类必须是子类的实例,(换句话说就是需要强转的父类必须是子类构造出来的,它本身就是子类的实现)
- 原理:父类的实现是父类的实例,和子类没有关系,不能直接强转
//AA 父类
public class AA {
private String aa;
public AA(){
this.aa = "AA";
System.out.println("父类构造");
}
//toString
}
//CC 子类
public class CC extends AA{
public CC() {
System.out.println("CC子类构造");
}
}
- 父类对象是子类实现 父类对象可以强转为子类对象
public class BB {
public static void main(String[] args) {
//父类对象是子类实现
AA a = (AA) new CC();
//父类可以强转为子类
CC cc = (CC) a;
System.out.println(cc.toString());
}
}
- 父类对象是父类实现 不能转为子类对象
public class BB {
public static void main(String[] args) {
//父类对象是父类实现
AA a = new AA();
//父类不可以强转为子类
CC cc = (CC) a;
System.out.println(cc.toString());
}
}
- Exception in thread "main" java.lang.ClassCastException: com.zhy.test.AA cannot be cast to com.zhy.test.CC
- 根本原因,这个 a 实现和子类就没关系(你出去可以代表你爸,你爸还没生你呢怎么代表你)
解决方法:
- 主要的解决方法是规规矩矩按子类实现来
- 如果特殊情况可以先把父类转成json字符串,再赋值转换成子类对象