A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

710730525

初级黑马

  • 黑马币:

  • 帖子:

  • 精华:

© 710730525 初级黑马   /  2014-8-21 20:12  /  2491 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

10黑马币
本帖最后由 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[],为什么?

最佳答案

查看完整内容

new Test(null)传递给构造器的参数是一个空的对象引用,因此看起来,好像是要调用参数类型为Object的构造器,并打印object。但数组也是引用类型,因此null也可以应用与double[]的重载版本。由此,就产生了混淆。[/backcolor] [/backcolor]Java的重载解析过程是以两阶段运行的: 第一阶段选取所有可获得并且可应用的方法或构造器; 第二阶段在第一阶段选取的方法或构造器中选取最精确的一 ...

7 个回复

倒序浏览
        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[]。
        希望你能明白!



回复 使用道具 举报
没错啊,就是这样的
回复 使用道具 举报
Java  菜鸟,共勉
回复 使用道具 举报
付剑翊 来自手机 中级黑马 2014-8-24 23:36:47
报纸
也就是说找相容性更小的参数类型,可以提高精确性
回复 使用道具 举报
努力学习中!
回复 使用道具 举报
构造器还有这般奥妙,寻找精确度匹配度更高的
回复 使用道具 举报
受教了。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马