黑马程序员技术交流社区

标题: 方法重载(overload)的问题 [打印本页]

作者: 罗家辉    时间: 2013-4-13 10:47
标题: 方法重载(overload)的问题
本帖最后由 罗家辉 于 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”
求解析,怎么会是这样
作者: 胡帅冰    时间: 2013-4-13 12:06
你这个代码是有问题的。首先,第二个方法private Confusing(double[] dA)  没有返回值类型,你在编译的时候会报错,需要添加一个返回值类型,比如:private  void Confusing(double[] dA)。  基于添加返回值类型之后  输出的结果是  Object  ,因为只有一个构造函数。  第二:如果把第二个方法private Confusing(double[] dA)  修改成构造函数,如:private A(double[] dA),结果是double array。
作者: 罗家辉    时间: 2013-4-13 12:20
胡帅冰 发表于 2013-4-13 12:06
你这个代码是有问题的。首先,第二个方法private Confusing(double[] dA)  没有返回值类型,你在编译的时候 ...

对,我打错了,现在改正了,我的意思的2个都是构造函数,当输入null为什么是调用第2个构造函数,而不是第一个
作者: 黑马伍哲沂    时间: 2013-4-13 12:21

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

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

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

java对重载解析分两个阶段,第一个阶段是获得可以应用的构造函数,就是符合参数的。
第二个阶段是,获得符合条件的构造函数中选取更精确的。
你这里数组也属于对象类型,所以当你传入null时,java选择了更为精确的double array。
作者: HM刘俊    时间: 2013-4-13 12:22
楼上正解
作者: Asan    时间: 2013-4-13 12:26
怎么会呢?输出明明是object!!!!! 而且private Confusing(double[] dA)应该加个返回值类型吧!
作者: 何俊森    时间: 2013-4-13 12:27
根据参数类型选择最精确的方法或构造器进行调用。对于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. }  
复制代码
在这种事先不能够明确类型的参数重载调用,只能够发生在父子或多层继承关系中,但不能发生在兄弟或者兄弟子孙间。
作者: 罗家辉    时间: 2013-4-13 12:41
何俊森 发表于 2013-4-13 12:27
根据参数类型选择最精确的方法或构造器进行调用。对于null我们事先并不能确定其类型,两个函数都满足条件, ...

具有更高的精确度? 那jvm它依赖什么原理来判断谁的精确度高
作者: 何俊森    时间: 2013-4-13 12:46
是jvm自动根据数据类型来判断的,具体根据什么原理来判断谁的精确度高,怎么工作的这要涉及到jvm原理了吧。可以参考jvm原理的相关书籍。
作者: 黄玉昆    时间: 2013-4-14 14:19
如果问题未解决,请继续追问,如果没有问题了,请将帖子分类 改为“已解决”,谢谢




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