我在Java中练习一些例子。代码如下所示:
public class NullPassing {
public static void main(String[] args) {
method1(null);
}
public static void method1(Exception e) {
System.out.println(e);
}
public static void method1(ArithmeticException e) {
System.out.println(e);
}
}
我对此几乎没有问题,
1)上面的代码使用method1(ArithmeticException e)执行并打印null,为什么不使用Exception(因为它的顶层是层次结构)?
猜猜:是因为与ArithmeticException
相比更具体的变量Exception
。如果是这样,为什么问题-2
2)通过在现有代码中引入以下方法,程序显示编译时异常。为什么呢?
public static void method1(NullPointerException e) {
System.out.println(e);
}
帮我学习。感谢
答案 0 :(得分:2)
我们有两位候选人,
public static void method1(Exception e) {
}
public static void method1(ArithmeticException e) {
}
我们传递null
并且两个方法都接受空值,因此我们选择更具体的方法,ArithmeticException
是Exception
,但反之则不然,因此{{1}更具体。
现在我们有三位候选人
ArithmeticException
第一个不在等式中,因为有更多特定的,所以我们留下两个候选人,一个需要public static void method1(Exception e) {
}
public static void method1(ArithmeticException e) {
}
public static void method1(NullPointerException e) {
}
而另一个需要NullPointerException
,两个都在同一个级别因此我们有一个模棱两可的电话。
答案 1 :(得分:2)
你对1的回答是正确的。如果选择两个或多个重载是候选的,并且其中一个比所有其他重载更具体,则选择最具体的重载。
JLS说这个(Section 15.12.2.5):
如果多个成员方法都可以访问并适用于方法调用,则必须选择一个为运行时方法调度提供描述符。 Java编程语言使用选择最具体方法的规则。非正式的直觉是,如果第一个方法处理的任何调用都可以传递给另一个没有编译时错误的调用,那么一个方法比另一个方法更具体。
(然后正式解释了什么"更具体的"意思。)
在你的第二个案例/问题中,你有这个:
public class NullPassing {
public static void main(String[] args) {
method1(null);
}
public static void method1(Exception e) {
System.out.println(e);
}
public static void method1(ArithmeticException e) {
System.out.println(e);
}
public static void method1(NullPointerException e) {
System.out.println(e);
}
}
现在我们有三个候选人(#34;可访问和适用的方法")。第一个比其他两个更不具体,但剩下的两个候选人中没有一个比另一个更具体。因此,这是编译错误。
显然,您可以通过强制转换null
消除电话。 e.g。
method1((NullPointerException)null)
答案 2 :(得分:1)
Java尝试为任何对象类型选择最具体的重载方法。 null对象的类型为" [special null type]"这是所有非原始类型的子类型;因此,最具体的子类型是ArithmeticException
。
有关Java编译器如何解决重载的更多信息,请参阅以下答案:https://stackoverflow.com/a/7199189/112964
一旦你有多个不在同一继承层次结构中的重载,Java编译器会为最具体的重载获得多个可能的候选者:两者 {{1 }和method1(NullPointerException)
是最具体的候选人。因此,您必须通过将method1(ArithmeticException)
强制转换为重载类型来告诉编译器您真正想要的内容:例如, null
。
有关模糊重载的详细信息,请参阅https://stackoverflow.com/a/5229890/112964