在创建几个构造函数时:
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;
}
为什么代码突然起作用?
答案 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");
}