[英]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.