我有一些这样的代码。
超级舱
public class Actual {
public int x = 123;
}
子类
public class Super extends Actual{
public int x = 999;
public int y = 12345;
}
public class Sub extends Super {
public int x = 144;
}
所以问题是我可以将超类的对象转换为子类吗?这是我尝试过的这个问题的正确吗?
public class Mid1Prob1 {
public static void main(String[] args) {
System.out.println("Testing...");
int x = 3;
Actual actual = new Super();
System.out.println(actual.x);
Super super1 = new Super();
System.out.println(super1.x);
Actual act = new Actual();
act = new Sub();
System.out.println(act.x);
}
}
但它给了类演员例外。
您可以将子类强制转换为超级类,但反之则不然。如果车辆是超级类,汽车是子类,则所有汽车(儿童)都是车辆(超级),但并非所有车辆都是汽车。
我可以将超类的对象转换为子类吗?
不,您只能以其他方式执行此操作。只能将子类对象分配给超类引用。
原因是,子类可以具有更多的功能并且更具体地针对问题。如果允许您将超类对象与子类大小写,那么该超类对象将如何获得这些子类功能?
没有可能这样做。你只能这样拥有sth。 Actual s = new Super();
或Super sp = new Super();
或Actual a = new Actual();
没有其他可能性。只有这种同义可能不会引发类播异常。
这些是创建超类和子类对象的唯一方法:
Actual act = new Actual();
Actual actual = new Super();
Actual actual2 = new Sub();
Super super1 = new Super();
Super super2 = new Sub();
Sub sub = new Sub();
没有其他办法。如果您尝试过,它会给您编译时错误来转换您的类或给出运行时错误java.lang.ClassCastException
。
从逻辑上讲,这是不可能的,因为每个子类都有特权在它从其父类继承的属性之上添加属性,最终导致不同的数据结构。向上移动(将子类转换为超类)时,添加的属性被简单地忽略,但基本属性就在那里,因此可以进行转换。但是,当向下转换(超类到子类)时,超类根本不适合子类的数据结构,最终导致类转换异常。尽管如此,有一个技巧在计算方面可能有点昂贵,但可以将一个类转换为另一个类(子类到超类,反之亦然),是的,对象映射器使之成为可能。以下是代码:
**SuperClass sc=new SuperClass();
sc.attribute="";
ChildClass ch= new ObjectMapper().convertValue(sc,ChildClass.class);**
即使在一个类与其他类没有关系的情况下也是如此
几种情况需要向下投射对象。这是不可能的。但是您始终可以使用超类对象创建一个新的子类对象。你的子类可以有一个构造函数,它将超类对象作为 aurgument。
A类{
int a = 0;
}
class B extends A{
int b = 0;
public B(){
}
public B( A ao){
super.a = ao.a;
}
}