【问题标题】:How does Java choose which constructor to use?Java 如何选择使用哪个构造函数?
【发布时间】:2012-08-21 14:40:00
【问题描述】:

我无法理解以下程序的输出。

public class Confusing {

    private Confusing(Object o) {
        System.out.println("Object");
    }

    private Confusing(double[] dArray) {
        System.out.println("double array");
    }

    public static void main(String[] args) {
        new Confusing(null);
    }
}

正确的输出是“双数组”。当两者都可以接受 null 时,为什么选择这个构造函数比另一个更具体?

【问题讨论】:

标签: java


【解决方案1】:

尽管两个构造函数都可以接受nulldouble[] 继承来自java.lang.Object,因此更具体。

【讨论】:

  • @downvoter 您愿意详细说明您认为答案有什么问题吗?
  • 可能是因为this(免责声明:不是我)
  • 我在 Liskov 的书中读到这一点:“如果进行了更多的转换,对 m1 的任何合法调用也将是对 m2 的合法调用,则方法 m1 比另一种方法 m2 更具体”。这意味着如果有一个方法 comp(int) 和 comp(long),传递一个 int 参数将转到 comp(int)(上面的 m1),因为它也可以转到 comp(long)(上面的 m2)与转换。但反之亦然,因为 comp 不能传递给 m1。但是,如何在我原来的问题中将此逻辑应用于 null 参数 - 它可以应用于 double[] 和 Object 而无需转换??
  • @user1614482 intlong 是原语,为它们定义了转换规则;与Objectdouble[] 不同,两者都不是另一个的子类。当重载使用与基子类相关的单个参数时,当传递null 时,子类获胜。
【解决方案2】:

编译动态类型语言的挑战是如何实现一个运行时系统,该系统可以在程序编译后选择最合适的方法或函数实现。将所有变量都视为 Object 类型的对象不会有效。

因此,选择特定的而不是Object

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-14
    • 1970-01-01
    • 2011-01-29
    • 2013-07-24
    • 1970-01-01
    • 2014-07-23
    相关资源
    最近更新 更多