繁体   English   中英

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

[英]Constructor Chaining and Visibility in Java

考虑此类:

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 我有点困惑。

编辑

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

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

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

.0d后缀仅表示这些是双.0d值。

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

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

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

尝试一下:)在同一个类中,无论可见性如何,您都不能定义具有相同签名的两个方法(是否构造函数)。 关于方法重载的官方文档

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

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

您所看到的称为超载

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

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

Passenger(int) -> Passenger(10)

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

Passenger(double) -> Passenger(2.5d)

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

构造方法Passenger(double)已在旅客类中定义

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM