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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 罗家辉 中级黑马   /  2013-4-13 10:47  /  1768 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 罗家辉 于 2013-4-14 14:57 编辑
  1. public class A {   
  2.      
  3.     private A(Object o) {   
  4.         System.out.println("Object");   
  5.     }   
  6.       
  7.     private A(double[] dA) {   
  8.         System.out.println("double array");   
  9.     }   
  10.       
  11.     public static void main(String[] args) {   
  12.         new A(null);   
  13.     }   
  14. }  
复制代码
自己搞了一下,你们会认为会它会输出什么?
之前我是认为它改输出的是“Object”,因为Object 是所有类的最终父类,应该参数 null 应该是匹配到 Object 那个重载方法去了。
但事实输出的是“double array”
求解析,怎么会是这样

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

9 个回复

倒序浏览
你这个代码是有问题的。首先,第二个方法private Confusing(double[] dA)  没有返回值类型,你在编译的时候会报错,需要添加一个返回值类型,比如:private  void Confusing(double[] dA)。  基于添加返回值类型之后  输出的结果是  Object  ,因为只有一个构造函数。  第二:如果把第二个方法private Confusing(double[] dA)  修改成构造函数,如:private A(double[] dA),结果是double array。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
胡帅冰 发表于 2013-4-13 12:06
你这个代码是有问题的。首先,第二个方法private Confusing(double[] dA)  没有返回值类型,你在编译的时候 ...

对,我打错了,现在改正了,我的意思的2个都是构造函数,当输入null为什么是调用第2个构造函数,而不是第一个
回复 使用道具 举报

你的意思是这两个构造方法重载,

所以第二个函数名应该改成A。

这里造成输出double array的原因是:构造函数参数类型造成混淆。

java对重载解析分两个阶段,第一个阶段是获得可以应用的构造函数,就是符合参数的。
第二个阶段是,获得符合条件的构造函数中选取更精确的。
你这里数组也属于对象类型,所以当你传入null时,java选择了更为精确的double array。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
楼上正解
回复 使用道具 举报
怎么会呢?输出明明是object!!!!! 而且private Confusing(double[] dA)应该加个返回值类型吧!
回复 使用道具 举报
根据参数类型选择最精确的方法或构造器进行调用。对于null我们事先并不能确定其类型,两个函数都满足条件,数组也是继承自Object所以,double[]比Object具有更高的精确度,于是输出结果就为double array.我想楼主想写的代码是这样的。
  1. public class A {   
  2.      
  3.     private A(Object o) {   
  4.         System.out.println("Object");   
  5.     }   
  6.       
  7.     private A(double[] d) {   
  8.         System.out.println("double array");   
  9.     }   
  10.       
  11.     public static void main(String[] args) {   
  12.         new A(null);   
  13.     }   
  14. }  
复制代码
在这种事先不能够明确类型的参数重载调用,只能够发生在父子或多层继承关系中,但不能发生在兄弟或者兄弟子孙间。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
何俊森 发表于 2013-4-13 12:27
根据参数类型选择最精确的方法或构造器进行调用。对于null我们事先并不能确定其类型,两个函数都满足条件, ...

具有更高的精确度? 那jvm它依赖什么原理来判断谁的精确度高
回复 使用道具 举报
是jvm自动根据数据类型来判断的,具体根据什么原理来判断谁的精确度高,怎么工作的这要涉及到jvm原理了吧。可以参考jvm原理的相关书籍。
回复 使用道具 举报
如果问题未解决,请继续追问,如果没有问题了,请将帖子分类 改为“已解决”,谢谢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马