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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张洁 中级黑马   /  2012-6-5 16:02  /  1683 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张洁 于 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[]

评分

参与人数 1技术分 +1 收起 理由
袁錦泰 + 1

查看全部评分

7 个回复

倒序浏览
private ConstructionDemo(Object obj) {
                System.out.println("Object");
        }
        private ConstructionDemo(double[] array) {
                System.out.println("double[]");
你传的NULL 到构造函数里
值附给了第一个
第二个还是继续执行
所以输出double[]
回复 使用道具 举报
顺道提一下  你程序一开始的 public 去掉 不然编译失败
回复 使用道具 举报
楼主要了解运行机制哟。

Java的重载解析过程是以两阶段运行的。
第一阶段:
选取所有可获得并且可应用的方法或构造器。
第二阶段:
在第一阶段选取的方法或构造器中选取最精确的一个。如果一个方法或构造器可以接受传递给另一个方法或构造器的任何参数,那么我们就说第一个方法比第二个方法缺乏精确性。

在我们的程序中,两个构造器都是可获得 并且可应用的。构造器ConstructionDemo(Object)可以接受任何传递给ConstructionDemo(double[ ])的参数,因此ConstructionDemo(Object)相对缺乏精确性。(每一个double数组都是一个Object,但是每一个Object并不一定是 一个double数组。)因此,最精确的构造器就是ConstructionDemo(double[ ]),这也就解释了为什么程序会产生这样的输出。

如果要是想用一个null参数来调用 ConstructionDemo(Object)构造器,你需要这样写代码:new ConstructionDemo((Object)null)。
这可以确保只有ConstructionDemo(Object)是可应用的。更一般地讲,要想强制要求编译器选择一个精确的重载版本,需要将实际的参数转型为形式参数所声明的类型。

评分

参与人数 1技术分 +1 收起 理由
袁錦泰 + 1 很给力!

查看全部评分

回复 使用道具 举报
首先,数组在作为参数传递的时候也是以数组对象传递的
所有的类都是Object的子类
根据对象初始化的时候,会选取最参数传递最精确的进行传递,
所以会得到你现在的运行结果
回复 使用道具 举报
private ConstructionDemo(double[] array) 里的
   double[] 如果改为8种任意一个基本类型(int double byte float...) 都会打印"Object"
                    而如果只要是任意引用类型则都会打印"double[]"
                    比如double[] int[] float[] String Integer Double Long ...
                    我是这么认为的:
                    因为任意的引用类型都可以被赋值为null 而基本类型不行,
                    当第二个构造函数传入类型为基本类型时调用第一个构造函数,
                    当第二个构造函数传入类型为引用类型时Object会"退位让贤"给适合传入对象的构造函数去执行;
                    楼主可以进行多次测试就能明白;
回复 使用道具 举报
谢谢各种同学的回答~~我已经明白啦
回复 使用道具 举报
你是怎么解决的? 给讲讲呗
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马