黑马程序员技术交流社区
标题:
[已解决]关于构造函数的一个疑问
[打印本页]
作者:
张洁
时间:
2012-6-5 16:02
标题:
[已解决]关于构造函数的一个疑问
本帖最后由 张洁 于 2012-6-5 16:54 编辑
构造方法一般天天用哈~
突然有次遇到一个问题,代码如下:
public class ConstructionDemo{
private ConstructionDemo(Object obj) {
System.out.println("Object");
}
private ConstructionDemo(double[] array) {
System.out.println("double[]");
}
public static void main(String[] args) {
new ConstructionDemo(null);
}
}
为什么最后结果是打印
double[]
作者:
包晗
时间:
2012-6-5 16:09
private ConstructionDemo(Object obj) {
System.out.println("Object");
}
private ConstructionDemo(double[] array) {
System.out.println("double[]");
你传的NULL 到构造函数里
值附给了第一个
第二个还是继续执行
所以输出double[]
作者:
包晗
时间:
2012-6-5 16:13
顺道提一下 你程序一开始的 public 去掉 不然编译失败
作者:
李春阳
时间:
2012-6-5 16:19
楼主要了解运行机制哟。
Java的重载解析过程是以两阶段运行的。
第一阶段:
选取所有可获得并且可应用的方法或构造器。
第二阶段:
在第一阶段选取的方法或构造器中选取最精确的一个。如果一个方法或构造器可以接受传递给另一个方法或构造器的任何参数,那么我们就说第一个方法比第二个方法缺乏精确性。
在我们的程序中,两个构造器都是可获得 并且可应用的。构造器ConstructionDemo(Object)可以接受任何传递给ConstructionDemo(double[ ])的参数,因此ConstructionDemo(Object)相对缺乏精确性。(每一个double数组都是一个Object,但是每一个Object并不一定是 一个double数组。)因此,最精确的构造器就是ConstructionDemo(double[ ]),这也就解释了为什么程序会产生这样的输出。
如果要是想用一个null参数来调用 ConstructionDemo(Object)构造器,你需要这样写代码:new ConstructionDemo((Object)null)。
这可以确保只有ConstructionDemo(Object)是可应用的。更一般地讲,要想强制要求编译器选择一个精确的重载版本,需要将实际的参数转型为形式参数所声明的类型。
作者:
伊文龙
时间:
2012-6-5 16:28
首先,数组在作为参数传递的时候也是以数组对象传递的
所有的类都是Object的子类
根据对象初始化的时候,会选取最参数传递最精确的进行传递,
所以会得到你现在的运行结果
作者:
胡团乐
时间:
2012-6-5 16:46
private ConstructionDemo(double[] array) 里的
double[] 如果改为8种任意一个基本类型(int double byte float...) 都会打印"Object"
而如果只要是任意引用类型则都会打印"double[]"
比如double[] int[] float[] String Integer Double Long ...
我是这么认为的:
因为任意的引用类型都可以被赋值为null 而基本类型不行,
当第二个构造函数传入类型为基本类型时调用第一个构造函数,
当第二个构造函数传入类型为引用类型时Object会"退位让贤"给适合传入对象的构造函数去执行;
楼主可以进行多次测试就能明白;
作者:
张洁
时间:
2012-6-5 16:55
谢谢各种同学的回答~~我已经明白啦
作者:
王超
时间:
2012-6-5 17:06
你是怎么解决的? 给讲讲呗
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2