无参数构造函数和带参数构造函数之间的关系
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
是一个 int
和 1000
也是一个 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 中使用隐式类型转换实现的)在序列中。由于参数的顺序与类型匹配很重要,因此可以确保将正确的值分配给正确的参数。我希望它能回答你的问题。
请看下面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
是一个 int
和 1000
也是一个 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 中使用隐式类型转换实现的)在序列中。由于参数的顺序与类型匹配很重要,因此可以确保将正确的值分配给正确的参数。我希望它能回答你的问题。