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哦,我现在明白了。改写了我的答案。