用Java链接构造函数

1 java constructor-overloading constructor-chaining

无法提出更好的标题。

一个经典的学习示例:class Human,其中属性是姓名,年龄,母亲和父亲。父母双方Human也是。

public class Human {
    String name;
    int age;
    Human mother;
}
Run Code Online (Sandbox Code Playgroud)

我想创建3个构造函数:

  1. Human();
  2. Human(String name, int age);
  3. Human(String name, int age, Human mother)

我确实了解链接的工作原理,这就是我所做的:

Human() {
    this("Jack", 22);
}

Human(int age, String name) {
    this(age, name, new Human()); // new Human() will cause SOF Error.
}

Human(int age, String name, Human mother) {
    this.age = age;
    this.name = name;
    this.mother = mother;
}
Run Code Online (Sandbox Code Playgroud)

如上所述,我StackOverflowError再次收到,我我知道为什么会这样。公平地说,我想我会得到像人类杰克这样的东西,而他的母亲也是人类杰克

尽管如此,我不知道该怎么做。我的猜测是,而不是new Human()我应该使用所有参数来调用构造函数,但是我不确定它是否为真并且是唯一可用的选项。

将不胜感激这里的任何指导。

T.J*_*der 5

是的,您对它为什么会发生是正确的。不过要确定的是:

  • new Human() 来电 this("Jack", 22)
  • this("Jack", 22) 来电 this(age, name, new Human())
  • new Human()在调用this("Jack", 22)再次
  • this(age, name, new Human())再次打电话
  • 直到用完堆栈

正确的方法是确保您不会回到起点。因此,如果在任何构造函数中使用new Human(String)new Human(String, int),则必须确保该构造函数(new Human(String)new Human(String, int))也不要使用new Human(String)new Human(String, int),因为这样会导致无限循环。您需要在new Human(String, int, Human)某个地方使用。因此,例如:

Human(int age, String name) {
    this(age, name, null);
}
Run Code Online (Sandbox Code Playgroud)

当然,这意味着新的实例将拥有nullmother