【发布时间】:2017-06-10 09:48:44
【问题描述】:
我正在为即将到来的 Java 期末考试尝试一些练习考试,但遇到了这个问题。
考虑以下类定义并指出“Test.main()”是否会成功编译。如果它确实编译,说明它是否会成功运行,如果没有,说明会抛出什么异常。
public class A {
public int method(int[] a) {...}
}
public class B extends A {
@Override
public int method(int[] a) {...}
}
public class C extends B {
@Override
public int method(int[] a) {...}
public void otherMethod() {...}
}
public class Test {
public static void main(String[] args) {
A a = new C();
B b = new B();
b = (B) a;
}
}
我认为 Test.main() 会编译但会抛出运行时异常,因为 a 是实际的 C 类型,我们正试图将其转换为 B 类型。事实并非如此,因为答案是这样的没问题。
我对铸造规则感到非常困惑,其中涉及的层次结构比 2 个级别更深。讲课幻灯片上真的没有这种信息!
那么,如果考试中出现此类问题,需要牢记哪些硬性“规则”?
【问题讨论】:
-
如果您对选角有疑问。您可以在继续投射之前使用
instanceof。 -
a的具体类型是什么?是C吧? C也是B吗?是的,因为 C 扩展了 B。所以演员表会成功。用真正的类来推理要简单得多。假设A是Vehicle,B是Car,C是ElectricCar。电动汽车是汽车。汽车是交通工具。a所指的对象是 ElectricCar。说这个对象是汽车是否正确?是的。所以演员表成功了。 -
@Enzokie 这对现实世界来说是个好建议,但遗憾的是,如果出现此类问题,它在考试期间对我没有帮助:/
-
@JBNizet 这是一个很好的思考方式!您提出了一个很好的观点,即我应该在精神上将这些名称不佳的类视为更真实的名称。这绝对可以帮助我。谢谢!