【问题标题】:why constructors with array as parameter precede constructors with Object in parameter [java]? [duplicate]为什么以数组为参数的构造函数在参数 [java] 中以 Object 为参数的构造函数之前? [复制]
【发布时间】:2014-08-10 06:43:57
【问题描述】:

我有这个令人困惑的代码:

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);
   }
}

当“编译”并运行程序时显示“双数组”为什么数组在对象之前?是否还有其他构造函数会发生这种令人困惑的行为?

【问题讨论】:

标签: java constructor


【解决方案1】:

a double[]Object也是在选择哪个构造函数(或方法)时,java将选择仍然匹配的最具体的参数类型。因为null会匹配任何参数类型,最具体的类型匹配,这里就是double[]

一旦你知道这个规则就不会混淆了,但是当两个或多个重载构造函数(或两个或多个重载方法)的不同之处仅在于其中一个参数类型是相应参数的子类时,就会发生这种情况在另一个。

JLS, Section 15.12.2.5 说明了当多个重载方法/构造函数匹配时,Java 如何选择调用的方法/构造函数:

Java 编程语言使用选择最具体方法的规则。

非正式的直觉是,如果第一个方法处理的任何调用都可以传递给另一个方法而不会出现编译时错误,那么一个方法比另一个方法更具体。

【讨论】:

    【解决方案2】:

    阅读 Java 语言规范中的更多内容以选择最具体的方法规则。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-01
      • 2021-01-08
      • 1970-01-01
      • 1970-01-01
      • 2012-09-15
      • 2018-07-29
      • 2016-03-26
      • 1970-01-01
      相关资源
      最近更新 更多