Java中的简单实践继承

Java中的简单实践继承,java,inheritance,theory,Java,Inheritance,Theory,我明天有一个测试,我对java中的继承有疑问 问题: 假设java中的一个程序,其中Y是X的子类。假设以下代码在该程序中有效: Y[] vetY = new Y[3]; X[] vetX = vety; 以下作业是否在此计划中有效?辩护 vetX[0] = new X(); 我的回答(不确定):它无效,因为vetX有Y的方法,我不知道Y中实现了什么。因此它可以编译,但不会运行。您的假设是正确的 通过newy Y[3]创建的数组只能容纳Y类型的对象或其子类。它不能存储像X这样的超类实例,因为存

我明天有一个测试,我对java中的继承有疑问

问题: 假设java中的一个程序,其中Y是X的子类。假设以下代码在该程序中有效:

Y[] vetY = new Y[3];
X[] vetX = vety;
以下作业是否在此计划中有效?辩护

vetX[0] = new X();

我的回答(不确定):它无效,因为
vetX
Y
的方法,我不知道Y中实现了什么。因此它可以编译,但不会运行。

您的假设是正确的

通过
newy Y[3]
创建的数组只能容纳
Y
类型的对象或其子类。它不能存储像
X
这样的超类实例,因为存在
X
Y
中没有所有可用方法的风险,所以即使

vetx [0] = new X();
编译很好(vetx是
X[]
的类型,因此编译器在这里没有看到任何错误),稍后您可以尝试通过
vetY
(它是
Y[]
的类型)访问此对象并尝试调用

vety[0].getPropertyAddedInY();
X
的哪个实例将没有


因此,为了防止这种情况,在运行时每个数组都会检查有人试图放入的数据类型,如果它不受支持,则该类型将抛出
java.lang.ArrayStoreException
,编译很好,因为编译器看到我们正在定义对其类型的引用。 但是在运行时JVM看到它被预先声明以存储子类型,并且当尝试存储父类型时,反向定义(child reference=parent obj)是不可能的,因此抛出一个异常

下面的例子可以更好地理解这一点-

class X {
    public void xMetod() {
        System.out.println("Called xMetod!");
    }
}

class Y extends X {
    public void yMethod() {
        System.out.println("Called yMethod!");
    }
}

public class InheritanceWithArrays {

    public static void main(String[] args) {
        X[] vetx= new Y[3];     // if new X[3] - then outputs in Called xMetod!
        vetx [0] = new X();     // Runtime exception-  java.lang.ArrayStoreException: X
        vetx[0].xMetod();   
    }

}

你试过了吗?发生了什么事?我做到了:(支持@Pshemo的答案,直到
vetx[0]=new X();
将抛出
ArrayStoreException
(不是对存储内容的访问))。“因此它可以编译,但不会运行。”这有点矛盾或模棱两可。程序将“运行”,但它可能会也可能不会抛出异常(请参阅其他答案;)。“运行”和“抛出异常”是完全不同的。如果没有足够的RAM启动JVM,程序将不会运行。是。我试过了,得到了以下信息。在线程“main”java.lang.ArrayStoreException:X at X.main(X.java:9)中运行:异常java结果:1