考虑此类:
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
。我有点困惑。
答案 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)已在旅客类中定义