下面的这个类呈现了两个令人混淆的构造器。 main方法调用了一个构造器,但它调用的究竟是哪一个?该程序的输出取决于这个问题的答案。它会打印什么?甚至它是否合法?
public class Confusing {
private Confusing(Object o){
System.out.println("Object!");
}
private Confusing(double[] fArray){
System.out.println("double array!");
}
public static void main(String[] args){
new confusing(null);
}
}
传递给构造器的是一个空的对象引用,因此,初看起来,改程序好像应该调用参数类型为Object的重载版本,并且打印Object。另一方面,数组也是引用类型,因此null也可以应用于类型为double[]的重载版本。看起来这个调用是模棱两可的,改程序不能编译,但如果试着运行改程序,就会发现它打印的是double array。
java的重载解析过程是分两阶段运行的,第一阶段选取所有可获得并且可应用的方法或构造器;第二阶段在第一阶段选取的方法或构造器中选取最精确的一个。如果一个方法或构造器可以接受传递给另一个方法或构造器的任何参数,那么我们就说第一个方法比第二个方法缺乏精确性。
在我们的程序中,两个构造器都可以获得并且可应用的,构造器Confusing(Object)可以接受任何传递给Confusing(double【】)的参数,因此Confusing(double【】)相对更精确,因此,最终选择该方法。
一般来说,要想强制要求编译器选择一个精确的重载版本,需要将实参转型为形参所声明的类型。
分享到:
相关推荐
java解惑java解惑java解惑java解惑java解惑java解惑
java中一些疑难问题的剖析,对初学java者有很好的帮助。
在JDK1.2中,Thread.stop、Thread.suspend以及其他许多线程相关的方法都因为它们不安全而不推荐使用了。下面的方法展示了你用Thread.stop可以实现的可怕事情之一
Java解惑Java解惑Java解惑Java解惑Java解惑Java解惑Java解惑Java解惑Java解惑Java解惑Java解惑Java解惑
一本很好的java参考书,帮助你解决java中的很多注意不到的问题。
这篇文档主要是介绍各种大家需要注意的java各种语法细节。希望对大家有所帮助。写的比较幽默。类似“十六进制的趣事”这种问题,估计在SSH大行其道的情况下,有些细节大家都不太关注了。
java中最容易被忽略的地方. 博文链接:https://justjavac.iteye.com/blog/175252
表达式之谜,符号之谜,循环之谜,异常之谜,类之谜,库之谜,各种谜题。
《Java解惑》《Java解惑》《Java解惑》《Java解惑》《Java解惑》《Java解惑》
Java解惑.pdf Java解惑.pdf Java解惑.pdf Java解惑.pdf
Java解惑中文版 Java解惑 java健壮程序
JAVA解惑.pdf JAVA解惑.pdf JAVA解惑.pdf
JAVA解惑,你面包括一些java经典的问题。
比较容易混淆的java面试题,看看对笔试面试有一定的帮助。
Java PUZZLE Java 解惑 Java PUZZLE Java 解惑 Java PUZZLE Java 解惑Java PUZZLE Java 解惑 Java PUZZLE Java 解惑 Java PUZZLE Java 解惑
与java相关的的学习,适合初学者,可以看看
JAVA解惑(PDF) Java学习中所涉及到的一些疑难杂症。
《Java解惑》 布洛克 著;陈昊鹏 译 扫描清晰带目录,仅供参阅,请支持正版