递归构造函数调用PersonAddress2(String,String,String,String)

时间:2018-11-29 04:09:42

标签: java constructor

在创建几个构造函数时:

public PersonAddress2(String newNameFirst) {
    this(newNameFirst, "Not set", "Not set", "Not set");
}

public PersonAddress2(String newNameFirst, String newNameLast) {
    this(newNameFirst, newNameLast, "Not set", "Not set");
}

public PersonAddress2(String newNameFirst, String newNameLast, String newEmail){
    this(newNameFirst, newNameLast, newEmail, "Not set");
}
public PersonAddress2(String newNameFirst, String newNameLast, String newEmail, String newTeleNumb){
    this(newNameFirst, newNameLast, newEmail, newTeleNumb);
}

我将收到此错误“递归构造函数调用PersonAddress2(String,String,String,String)”。这意味着什么?但是当我将构造函数设置为:

public PersonAddress2(String newNameFirst) {    
    this(newNameFirst, "Not set", "Not set", "Not set");
}

public PersonAddress2(String newNameFirst, String newNameLast) {
    this(newNameFirst, newNameLast, "Not set", "Not set");
}

public PersonAddress2(String newNameFirst, String newNameLast, String newEmail) {
    this(newNameFirst, newNameLast, newEmail, "Not set");
}
public PersonAddress2(String newNameFirst, String newNameLast, String newEmail, String newTeleNumb) {
    this.nameFirst = newNameFirst;
    this.nameLast = newNameLast;
    this.eMail = newEmail;
    this.teleNumb = newTeleNumb;
}

为什么代码突然起作用?

2 个答案:

答案 0 :(得分:1)

调用this()(带有任意数量的参数)是指当前类的构造函数。因此,当我们调用this(String arg)编译器时,将在当前类中寻找一个带有String元素的构造函数。如果不存在,则会出现编译时错误

class Person {
     private String data;
     Person() {
         this("test");
     }
     Person(String data) {
         this.data = data;
     }
}

这可以正常工作,但是当您使用String arg删除构造函数时,它将给出编译时错误。

构造函数主要用于初始化实例变量,并且一个类不能有多个具有相同签名的构造函数。

class Person {
     private String data;
     Person(String data) {
         this("test");
     }
     Person(String data) {  // compile time error.
         this.data = data;
     }
}

这就是为什么我们定义的每个构造函数都变得唯一。

因此,在您的第一个代码中,有一个构造函数执行链,从一个参数构造器到两个参数,然后是三个参数,最后是四个参数。现在进入您的第四个构造函数,编写的代码是this(newNameFirst, newNameLast, newEmail, newTeleNumb);,它不过是对第四个构造函数(带有四个String args)的调用。因此,它一直循环不断,所以为了避免此Java将其定义为编译时错误。

现在在您的第二个代码中,您正在使用构造函数参数来初始化属性或将值赋给属性,因此不会遇到无限循环,这就是为什么要传递代码的原因。

这是您遇到相同错误的另一种方式

class Person {
    private String data;
    public Person() {
        this("test");
    }
    public Person(String data) {
        this();
    }
}

答案 1 :(得分:0)

在您的第一个代码实例中,您是从自身内部调用构造函数的:

public PersonAddress2(String newNameFirst, String newNameLast, String newEmail, String newTeleNumb){
    this(newNameFirst, newNameLast, newEmail, newTeleNumb); // calls the same constructor, hence the error
}

另一方面,以上结果导致了不确定的递归

public PersonAddress2(String newNameFirst, String newNameLast, String newEmail, String newTeleNumb) {
    this.nameFirst = newNameFirst;
    this.nameLast = newNameLast;
    this.eMail = newEmail;
    this.teleNumb = newTeleNumb;
}

按照您遵循的模式断开调用构造函数的链。


这里的模式是即使没有提供任何属性,也要使用所有args调用构造函数(只是对于此类属性,其值默认为"Not set"),调整 只是为了提高可读性

public PersonAddress2(String newNameFirst) {
    new PersonAddress2(newNameFirst, "Not set", "Not set", "Not set"); // just a way to read
}

public PersonAddress2(String newNameFirst, String newNameLast) {
    new PersonAddress2(newNameFirst, newNameLast, "Not set", "Not set");
}

public PersonAddress2(String newNameFirst, String newNameLast, String newEmail){
   new PersonAddress2(newNameFirst, newNameLast, newEmail, "Not set");
}