首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么Java更喜欢调用双重构造函数?

为什么Java更喜欢调用双重构造函数?
EN

Stack Overflow用户
提问于 2015-06-15 16:52:18
回答 2查看 1.9K关注 0票数 13
代码语言:javascript
复制
public class test {
    test(double[] a)
    {
        System.out.println("in double");
    }
    test(Object a)
    {
        System.out.println("in object");
    }
    public static void main(String args[])
    {
        new test(null);
    }
}

在上面的代码中,我传递null作为构造函数参数。由于null可以是任何东西,所以上面的代码编译得很好。当我运行代码时,我期望它在对象中打印,但是它打印成双倍,这背后的原因是什么?

注意:链接的问题可能不会重复,因为这个问题与原始数据类型vs对象有关。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-15 16:55:16

原因是Java将null解释为任何类型,在选择要调用的方法时,它将选择最具体的方法,首先是参数类型。因为null可以是double[]类型,而double[]Object,所以编译器将选择接受double[]的方法。如果选择涉及同样可能但不相关的类型,例如double[]String,那么编译器将无法选择一个方法,这将导致方法调用错误。

JLS,第4.1节声明:

空引用总是可以分配或转换给任何引用类型(§5.2,§5.3,§5.5)。 在实践中,程序员可以忽略空类型,而只是假装null只是一个特殊的文字,可以是任何引用类型。

票数 21
EN

Stack Overflow用户

发布于 2015-06-15 16:54:28

这两个构造函数都适用,因为null可以转换为Objectdouble[],所以编译器需要使用重载解析来确定要调用哪个构造函数。

JLS 15.9.3使用JLS 15.12.2来确定要使用的“最特定”构造函数签名,根据JLS 15.12.2.5的说法,基于哪个构造函数具有最特定的参数类型。确切的细节有点模糊(IMO),但在本例中,“如果您可以将T1转换为T2,但不能将T2转换为T1,那么T1更具体”的基本经验规则就足够了。

double[]是一个比Object更具体的类型,因为有一个从double[]Object的隐式转换,反之亦然。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30850695

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档