Java:使用子类数组对象分配的超类数组对象

Siv*_*iva 6 java arrays subclass object superclass

我正在尝试将子类对象数组分配给它的超类.该程序编译成功,但我得到了ArrayStoreException.我知道数组父和子是对同一个数组的引用,但我不应该func至少能够访问方法吗?

class Pclass
{
    Pclass()
    {
        System.out.println("constructor : Parent class");
    }

    public void func()
    { 
        System.out.println("Parent class");
    }
}

class Cclass extends Pclass
{
    Cclass()
    { 
        System.out.println("Constructor : Child class");
    }

    public void func2()
    {  
        System.out.println("It worked");
    }

    public void func()
    { 
        System.out.println("Common");
    }
}

public class test
{     
    public static void main(String ab[])
    {    
        Cclass[] child = new Cclass[10];
        Pclass[] parent = child;
        parent[0]=new Pclass();
        parent[0].func();
    }
}
Run Code Online (Sandbox Code Playgroud)

Sar*_*tal 4

你不能这样做:

Cclass[] child = new Cclass[10];
Pclass[] parent = child;
parent[0]=new Pclass();
Run Code Online (Sandbox Code Playgroud)

你应该尝试这样做:

Cclass[] child = new Cclass[10];
Pclass[] parent = child;
parent[0]=new Cclass();
Run Code Online (Sandbox Code Playgroud)

那是因为,您首先将 Pclass 数组分配给只能有 Cclass 对象的子引用,然后您试图将 Pclass 对象分配给父引用,这是不允许的!

看,发生的情况是,当您编写新的 Cclass 时,您已经在堆上创建了一个 Cclass 对象,尽管 Cclass 对象在数组中为空,但现在它们只接受 Cclass 对象或其子类的对象

所以分配 Pclass 对象是非法的!

获得运行时异常而不是编译时异常的原因:

编译器仅检查这些类是否位于同一继承层次结构中,因为它们位于同一层次结构中,因此您会收到运行时异常。