我做了以下操作,一段时间后出现了 stackoverflow 错误,我明白了为什么会这样。
public class Cat {
String name="default name";
Cat insideCat;
public Cat(){
System.out.println("Cat constructor");
insideCat = new Cat();
}
}
但是,如果我不在构造函数中创建新的 Cat 对象,而是采用 Cat 类型的参数并将其分配给 insideCat 字段,会怎样呢?
public class Cat {
String name="default name";
Cat insideCat;
public Cat(Cat insideCat){
System.out.println("Cat constructor");
this.insideCat = insideCat;
}
}
我只是在摆弄代码,只是想找出 Java 可以做什么和不能做什么。在第二个代码中,一切看起来都很正常,直到我开始测试这个类。我需要一个 Cat 对象来创建一个 Cat 对象(要创建这个 Cat 对象,我需要另一个 Cat 对象……然后继续)。所以从技术上讲,我无法测试这门课。
所以我的问题是为什么 java 允许创建它自己类型的实例变量?我想构造函数的全部目的是初始化它的实例变量。因此,要么我必须创建一个新对象来初始化 insideCat,要么我必须从外部获取 Cat 对象。两者似乎都不起作用。
我在这里错过了什么。有没有发生过它自己类型的实例变量可以变得有用,并且可以毫无问题地使用的情况?想出这样的类(class)是不是糟糕的 OOP 实践?
最佳答案
这样的类一直存在。
考虑链表或树,例如,
class ListNode {
ListNode next;
// Etc.
}
class TreeNode {
TreeNode left;
TreeNode right;
// Etc.
}
您不会在构造函数中初始化“子”对象,您稍后会添加它们。
在您的示例中,您需要一个稍后创建 insideCat
的方法。一般来说,您不会创建具有完全相同状态的子对象,在构建时会有一些东西可以区分它们,在这种情况下,您可能会遇到“天啊,现在停止创建这些”的情况,或者当它们正在创建时正在添加,例如,您将通过方法而不是在构造函数中添加它们。
关于java - 一个类有自己类型的字段可以吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29546485/