无参数构造函数和带参数构造函数之间的关系

The relationship between a no-arg constructor and a constructor with arguments

请看下面class:

public class Loan {

    private double annualInterestRate;
    private int numberOfYears;
    private double loanAmount;
    private java.util.Date loanDate;

    // Default constructor
    public Loan() {
        this(2.5, 1, 1000);
    }

}

对于代码行 this(2.5, 1, 1000); ,我在 Eclipse 中收到以下错误消息:"The constructor Loan(double, int, int) is undefined"。添加带有参数的新构造函数时,此错误消失:

// Construct a loan with specified annual interest rate, number of years and loan amount
    public Loan(double annualInterestRate, int numberOfYears, int loanAmount) {
        this.annualInterestRate = annualInterestRate;
        this.numberOfYears = numberOfYears;
        this.loanAmount = loanAmount;
        loanDate = new java.util.Date();
    }

为什么创建带参数的构造函数会消除默认构造函数的 "undefined" 错误?这两个不同的构造函数如何相互关联?

我怎么知道 this(2.5, 1, 1000) 中的值分配给了正确的数据字段?我假设 2.5 应该分配给 annualInterestRate,1 分配给 numberOfYears,1000 分配给 loanAmount

在您的无参数构造函数中,行

        this(2.5, 1, 1000);

明确表示 "call another constructor for the same class as the current constructor, but which takes these arguments"。

这就是添加其他构造函数解决问题的原因。传递参数的顺序需要与参数在该构造函数中出现的顺序相匹配,该构造函数的参数列表定义了调用它时需要放入参数的顺序。

这两个构造函数之间的关系是它们是链式的。带有 3 个参数的是主构造函数,另一个使用默认值调用主构造函数。以这种方式设计构造函数有助于一致地初始化对象,因为总是会调用单个主构造函数。 (例如,无论您调用哪个构造函数,都会设置 loanDate 实例字段。)

你遇到了错误

"The constructor Loan(double, int, int) is undefined"

因为如果你看一下:

this(2.5, 1, 1000);

你可以看到参数如下 2.5 是一个 double, 1 是一个 int1000 也是一个 int,因此它使用这些参数调用构造函数,但没有定义这样的构造函数

并且使用 this 关键字我们正在调用 当前 class 的构造函数,因此我们期望构造函数具有这些参数,这就是为什么你需要实现这个构造函数:

// Construct a loan with specified annual interest rate, number of years and loan amount
public Loan(double annualInterestRate, int numberOfYears, int loanAmount) {
    this.annualInterestRate = annualInterestRate;
    this.numberOfYears = numberOfYears;
    this.loanAmount = loanAmount;
    loanDate = new java.util.Date();
}

正如 David 在评论中所述,错误消失了,因为您定义了指定的构造函数。

为了回答您的问题,首先要知道 Java 是一种强类型语言。参考 Wiki

现在进入您的查询,当您正确 this(2.5, 1, 100) 时,它会尝试找出 this() 引用的构造函数,参数类型为 double,int,int(这是在 Java 中使用隐式类型转换实现的)在序列中。由于参数的顺序与类型匹配很重要,因此可以确保将正确的值分配给正确的参数。我希望它能回答你的问题。