我做了以下工作,一段时间后出现了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 ListNode {
ListNode next;
// Etc.
}
class TreeNode {
TreeNode left;
TreeNode right;
// Etc.
}
您不会在构造函数中初始化“子”对象,而是稍后添加它们。
在您的示例中,您需要insideCat
一个稍后创建的方法。通常,您不会创建状态完全相同的子对象,在构造时可能会有所区别,在这种情况下,您可能会遇到“哦,天哪,现在就停止创建这些对象”的情况,或者当它们处于被添加,例如,您将通过方法而不是在构造函数中添加它们。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句