从超类创建一个子类

Del*_*ens 4 java inheritance

让我们说:

class A {
    public int fieldA = 0;
}

class B extends A {
    public int fieldB = 0; 
}
Run Code Online (Sandbox Code Playgroud)

现在,我想从A创建一个B实例:

A a = new A();
B b = (B) new A();
Run Code Online (Sandbox Code Playgroud)

这给出了classCastException.我可以在B中创建一个带有A实例和复制字段的costructor,但它显然是非实际的:

class B extends A {
    public int fieldB = 0; 

    B (A a){
        fieldA = a.fieldA;
    }
}
Run Code Online (Sandbox Code Playgroud)

谢谢您的帮助

Ani*_*kur 8

以下面的例子为例

public class Animal
{
  public void eat(){}
}
public class Dog extends Animal
{
  public void eat(){}
  public void main(String[] args)
  {
    Animal animal=new Animal();
    Dog dog=(Dog) animal; //will not work
  }
}
Run Code Online (Sandbox Code Playgroud)

通过使用演员你基本上告诉编译器"相信我.我是一个专业人士,我知道我在做什么,我知道虽然你不能保证,但我告诉你这个动物变量是肯定会成为一只狗."

由于动物实际上不是狗(它是动物,你可以做动物动物=新狗();而且它是狗)VM在运行时抛出异常,因为你违反了那种信任(你告诉过)编译器一切都会好的,但事实并非如此!)

如果你尝试在不同的继承层次结构中强制转换对象(例如将一个Dog转换为一个String),那么编译器会比盲目地接受所有内容更聪明一点,然后编译器会将它抛回给你,因为它知道它永远不会起作用.

因为你实际上只是停止编译器的抱怨,所以每次你强制转换它都很重要,通过在if语句中使用instanceof来检查你是否会导致ClassCastException(或者是那种效果.)

在你的情况下,你说我的参考b将指向B点的对象,然后你指向A类的对象(这不是B类的参考b期望的对象).因此,您将获得classCastException.

你可以做点什么

A a = new B();
B b = (B) a;
Run Code Online (Sandbox Code Playgroud)