考虑这个课程:
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'是Passenger的新实例。 'fred'使用一个参数public Passgener(int freeBags)
调用构造函数。然后这行this(freeBags > 1 ? 25.0d : 50.0d)
被调用。这是我的问题:编译器如何知道第一个构造函数中的条件语句链接到'private'构造函数?我的猜测是条件语句中的'd'指向私有构造函数中的double参数。但是,如果有另一个带有double参数的构造函数呢?它会链接到什么?在第一个构造函数中没有提到perBagFee
。我有点困惑。
编辑
编译器如何知道第一个构造函数中的条件语句链接到'private'构造函数?
由于您的三元表达式返回的任何值都是double值,因此编译器知道此调用是指接收一个double参数的构造函数方法。
我的猜测是条件语句中的'd'指向私有构造函数中的double参数。
.0d
后缀仅表示那些是双重值。
在第一个构造函数中没有提到perBagFee
方法参数名称在方法本身之外没有任何相关性。编译器将始终检查表达式评估的对象类型,以便确定要调用的方法。
但是,如果有另一个带有double参数的构造函数呢?
试一试:)在同一个类中,无论可见性如何,都无法定义具有相同签名的两个方法(构造函数或不构造函数)。 Official docs on methods overloading:
重载方法由传递给方法的参数的数量和类型区分。
您不能声明多个具有相同名称和相同数量和类型的参数的方法,因为编译器无法区分它们。
您可以看到的内容称为重载
重载是一种用于避免冗余代码的概念,其中多次使用相同的方法名称但使用不同的参数集。在运行时调用的实际方法在编译时解析,从而避免运行时错误。
Java不记得方法的变量名称,以识别要调用的重载构造函数,而Java尝试匹配变量类型
Passenger(int) -> Passenger(10)
Passenger(int, int) -> Passenger(10,10)
Passenger(double) -> Passenger(2.5d)
所以,如果你定义了与Passenger(double)
相同模式的另一个构造函数。 Java将抛出编译时错误
构造函数Passenger(double)已经在Passenger类中定义