Java中的构造函数链接和可见性
以这一类为例:Java中的构造函数链接和可见性,java,parameters,constructor,visibility,chaining,Java,Parameters,Constructor,Visibility,Chaining,以这一类为例: 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
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)
。
我的问题是:编译器如何知道第一个构造函数中的条件语句链接到“private”构造函数?我的猜测是,条件语句中的“d”指向私有构造函数中的双参数。但是如果有另一个构造函数具有双参数呢?那么它会链接到什么?在第一个构造函数中没有提到perBagFee
。我有点困惑 编辑
编译器如何知道第一个构造函数中的条件语句链接到“private”构造函数
由于三元表达式返回的任何一个值都是双值,编译器知道此调用引用了接收到一个双参数的构造函数方法
我的猜测是,条件语句中的“d”指向私有构造函数中的双参数
.0d
后缀仅表示这些是双值
在第一个构造函数中没有提到perBagFee
方法参数名称与方法本身无关。编译器将始终检查表达式的求值对象类型,以确定要调用的方法
但是如果有另一个构造函数具有双参数呢
试试看:)在同一个类中,无论可见性如何,都不能定义具有相同签名的两个方法(构造函数或非构造函数):
重载方法通过传递给方法的参数的数量和类型来区分
不能声明多个具有相同名称、相同数量和参数类型的方法,因为编译器无法区分它们
编辑
编译器如何知道第一个构造函数中的条件语句链接到“private”构造函数
由于三元表达式返回的任何一个值都是双值,编译器知道此调用引用了接收到一个双参数的构造函数方法
我的猜测是,条件语句中的“d”指向私有构造函数中的双参数
.0d
后缀仅表示这些是双值
在第一个构造函数中没有提到perBagFee
方法参数名称与方法本身无关。编译器将始终检查表达式的求值对象类型,以确定要调用的方法
但是如果有另一个构造函数具有双参数呢
试试看:)在同一个类中,无论可见性如何,都不能定义具有相同签名的两个方法(构造函数或非构造函数):
重载方法通过传递给方法的参数的数量和类型来区分
不能声明多个具有相同名称、相同数量和参数类型的方法,因为编译器无法区分它们
您所看到的被称为重载 重载是一个用于避免冗余代码的概念,其中 方法名称被多次使用,但使用了一组不同的 参数。在运行时调用的实际方法是 在编译时解析,从而避免运行时错误 Java不会记住方法的变量名来确定要调用哪个重载构造函数,相反,Java会尝试匹配变量类型
Passenger(int) -> Passenger(10)
Passenger(int, int) -> Passenger(10,10)
Passenger(double) -> Passenger(2.5d)
因此,如果您定义了另一个与Passenger(double)
. Java将抛出编译时错误
建造商乘客(双人)已在乘客类中定义
您所看到的被称为重载 重载是一个用于避免冗余代码的概念,其中 方法名称被多次使用,但使用了一组不同的 参数。在运行时调用的实际方法是 在编译时解析,从而避免运行时错误 Java不会记住方法的变量名来确定要调用哪个重载构造函数,相反,Java会尝试匹配变量类型
Passenger(int) -> Passenger(10)
Passenger(int, int) -> Passenger(10,10)
Passenger(double) -> Passenger(2.5d)
因此,如果您定义了另一个与Passenger(double)
. Java将抛出编译时错误
建造商乘客(双人)已在乘客类中定义
但是如果有另一个构造函数具有双参数呢?试试看。为了节省您一分钟的时间,这将是一个编译时错误(除非它有不同的签名)。但是如果有另一个构造函数具有双参数呢?试试看。为了节省您一分钟的时间,这将是一个编译时错误(除非它有不同的签名)。谢谢,但这不是我要问的。让我澄清一下,在没有提到
perBagFee
的情况下,这个三元表达式如何链接到私有构造函数?@ginop86哦,我现在明白了。重写我的答案。谢谢,但那不是我要问的。让我澄清一下,在没有提到perBagFee
的情况下,这个三元表达式如何链接到私有构造函数?@ginop86哦,我现在明白了。改写了我的答案。