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' 用一个参数调用构造函数,该参数是public Passgener(int freeBags)。然后调用此行this(freeBags > 1 ? 25.0d : 50.0d)。 这是我的问题:编译器如何知道第一个构造函数中的条件语句链接到"私有"构造函数?我的猜测是条件语句中的"d"指向私有构造函数中的双精度参数。但是,如果存在另一个具有双参数的构造函数呢?那会链到什么呢?在第一个构造函数中没有提到perBagFee。我有点困惑。

编辑

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

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

我的猜测是条件语句中的"d"指向私有构造函数中的双精度参数。

.0d后缀只是说这些是双精度值。

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

方法参数名称在方法本身之外没有任何相关性。编译器将始终检查表达式的计算结果为哪种对象,以便确定要调用的方法。

但是,如果存在另一个具有双参数的构造函数呢?

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

重载方法通过传递到方法中的参数的数量和类型进行区分。

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

你可以看到的称为重载

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

Java不记得方法的变量名来识别要调用哪个重载的构造函数,相反,Java试图匹配变量类型

Passenger(int) -> Passenger(10)
Passenger(int, int) -> Passenger(10,10)
Passenger(double) -> Passenger(2.5d)

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

构造器乘客(双(已在类乘客中定义

最新更新