Java中的构造函数链接和可见性

时间:2018-09-01 04:41:08

标签: java parameters constructor visibility chaining

考虑此类:

public class Passenger {
  public Passenger() {

  }

  public Passenger(int freeBags) {
      this(freeBags > 1 ? 25.0d : 50.0d);
      this.freeBags = freeBags;
  }

  public Passenger(int freeBags, int checkedBags) {
      this(freeBags);
      this.checkedBags = checkedBags;
  }

  private Passenger(double perBagFee) {
      this.perBagFee = this.perBagFee;
  }
}


Passenger fred = new Passenger(2);

如果我理解正确,那么“ fred”是“乘客”的新实例。 “ fred”使用一个参数public Passgener(int freeBags)调用构造函数。然后,该行this(freeBags > 1 ? 25.0d : 50.0d)被调用。 这是我的问题:编译器如何知道第一个构造函数中的条件语句链接到“私有”构造函数?我的猜测是条件语句中的“ d”指向私有构造函数中的double参数。但是,如果还有另一个带有double参数的构造函数呢?它将链接到什么?在第一个构造函数中没有提到perBagFee。我有点困惑。

2 个答案:

答案 0 :(得分:1)

编辑

  

编译器如何知道第一个构造函数中的条件语句链接到“私有”构造函数?

由于三元表达式返回的两个值都是双精度值,因此编译器知道此调用引用的是接收到一个双精度参数的构造方法。

  

我的猜测是条件语句中的'd'指向私有构造函数中的double参数。

后缀.0d仅表示那些是双精度值。

  

在第一个构造函数中没有提及perBagFee

方法参数名称与方法本身无关。编译器将始终检查您的表达式对哪种对象求值,以便确定您要调用的方法。

  

但是,如果还有另一个带有double参数的构造函数呢?

尝试一下:)在同一个类中,无论可见性如何,您都不能定义具有相同签名的两个方法(是否构造函数)。 Official docs on methods overloading

  

重载的方法通过传递给该方法的参数的数量和类型来区分。

     

您不能声明多个具有相同名称,相同数量和类型的参数的方法,因为编译器无法区分它们。

答案 1 :(得分:1)

您看到的称为超载

  

重载是用于避免冗余代码的概念   方法名称已多次使用,但使用了一组不同的名称   参数。在运行时调用的实际方法是   在编译时解决,从而避免了运行时错误。

Java不会记住该方法的变量名来标识要调用的重载构造函数,而是Java尝试匹配变量类型

Passenger(int) -> Passenger(10)

Passenger(int, int) -> Passenger(10,10)

Passenger(double) -> Passenger(2.5d)

因此,如果您定义了另一个与Passenger(double)相同模式的构造函数 。 Java将抛出编译时错误

  

构造函数Passenger(double)已在旅客类中定义