父類轉子類
- 父類強轉子類的要求:父類必須是子類的實例,(換句話說就是需要強轉的父類必須是子類構造出來的,它本身就是子類的實現)
- 原理:父類的實現是父類的實例,和子類沒有關系,不能直接強轉
//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字符串,再賦值轉換成子類對象