Java中的简单实践继承
我明天有一个测试,我对java中的继承有疑问 问题: 假设java中的一个程序,其中Y是X的子类。假设以下代码在该程序中有效: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这样的超类实例,因为存
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