Java中的构造函数链接和可见性

问题描述 投票:0回答:2

考虑这个课程:

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。我有点困惑。

java parameters constructor visibility chaining
2个回答
1
投票

编辑

编译器如何知道第一个构造函数中的条件语句链接到'private'构造函数?

由于您的三元表达式返回的任何值都是double值,因此编译器知道此调用是指接收一个double参数的构造函数方法。

我的猜测是条件语句中的'd'指向私有构造函数中的double参数。

.0d后缀仅表示那些是双重值。

在第一个构造函数中没有提到perBagFee

方法参数名称在方法本身之外没有任何相关性。编译器将始终检查表达式评估的对象类型,以便确定要调用的方法。

但是,如果有另一个带有double参数的构造函数呢?

试一试:)在同一个类中,无论可见性如何,都无法定义具有相同签名的两个方法(构造函数或不构造函数)。 Official docs on methods overloading

重载方法由传递给方法的参数的数量和类型区分。

您不能声明多个具有相同名称和相同数量和类型的参数的方法,因为编译器无法区分它们。


1
投票

您可以看到的内容称为重载

重载是一种用于避免冗余代码的概念,其中多次使用相同的方法名称但使用不同的参数集。在运行时调用的实际方法在编译时解析,从而避免运行时错误。

Java不记得方法的变量名称,以识别要调用的重载构造函数,而Java尝试匹配变量类型

Passenger(int) -> Passenger(10)

Passenger(int, int) -> Passenger(10,10)

Passenger(double) -> Passenger(2.5d)

所以,如果你定义了与Passenger(double)相同模式的另一个构造函数。 Java将抛出编译时错误

构造函数Passenger(double)已经在Passenger类中定义

© www.soinside.com 2019 - 2024. All rights reserved.