no-arg构造函数和带参数的构造函数之间的关系

时间:2016-03-29 15:44:31

标签: java constructor default-constructor

请查看以下课程:

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中收到以下错误消息:“构造函数Loan(double,int,int)未定义”。添加带有参数的新构造函数时,此错误消失:

// 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

3 个答案:

答案 0 :(得分:3)

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

GetSystemMetrics()

显式意味着“调用与当前构造函数相同的类的另一个构造函数,但它接受这些参数”。

这就是为什么添加其他构造函数可以解决问题。传递参数的顺序需要与参数在该构造函数上出现的顺序相匹配,构造函数的参数列表定义了调用参数时所需的顺序。

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

答案 1 :(得分:2)

您收到了错误

  

"构造函数Loan(double,int,int)未定义"

因为如果你看看:

this(2.5, 1, 1000);

您可以看到参数如下2.5 double1int1000,它也是{ {1}},因此它使用这些参数调用构造函数,并且没有定义此类构造函数

使用这个关键字,我们将称为当前类的构造函数,因此我们期待一个带有这些参数的构造函数,这就是为什么你需要实现这个构造函数:

int

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

答案 2 :(得分:1)

为了回答您的问题,第一件事是Java是一种强类型语言。参考Wiki

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