黑马程序员技术交流社区

标题: 构造器问题 [打印本页]

作者: 710730525    时间: 2014-8-21 20:12
标题: 构造器问题
本帖最后由 710730525 于 2014-8-21 20:22 编辑

没网络,都是手写的,见谅。
如下面代码:
public class Test{
  Test(Object obj){
    System.out.println("object");
  }
  Test(double[] dArr){
    System.out.println("double[]");
  }
  public static void main(String[] args){
    new Test(null);
  }
}
程序运行打印的是double[],为什么?


作者: HKing    时间: 2014-8-21 20:12
        new Test(null)传递给构造器的参数是一个空的对象引用,因此看起来,好像是要调用参数类型为Object的构造器,并打印object。但数组也是引用类型,因此null也可以应用与double[]的重载版本。由此,就产生了混淆。
        Java的重载解析过程是以两阶段运行的:
            第一阶段选取所有可获得并且可应用的方法或构造器;
            第二阶段在第一阶段选取的方法或构造器中选取最精确的一个。
        如果一个方法或构造器可以接受传递给另一个方法或构造器的任何参数,那么就说第一个方法比第二个方法缺乏精确性。而在上面的程序中,两个构造器都是可获得并且可应用的。构造器Test(Object obj)可以接受任何传递给Test(double[ ] dArr)的参数,因此Test(Object obj)相对缺乏精确性。(每一个double数组都是一个Object,但是每一个Object并不一定是一个double数组)因此,最精确的构造器就是Test(double[ ] dArr),这也就解释了为什么程序输出double[]。
        希望你能明白!




作者: 刘瑞    时间: 2014-8-21 20:31
没错啊,就是这样的
作者: IAM黑马丶    时间: 2014-8-21 21:49
Java  菜鸟,共勉
作者: 付剑翊    时间: 2014-8-24 23:36
也就是说找相容性更小的参数类型,可以提高精确性
作者: ︶喂〆快到碗里    时间: 2014-8-25 13:44
努力学习中!
作者: lanzy1989    时间: 2014-8-31 22:47
构造器还有这般奥妙,寻找精确度匹配度更高的
作者: 哈达洋    时间: 2014-9-4 20:51
受教了。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2