当前位置: 首页 > 面试题库 >

一个类具有自己的类型的字段可以吗

郑功
2023-03-14
问题内容

我做了以下工作,一段时间后出现了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对象。两者似乎都不起作用。

我在这里想念什么。有没有发生过其自身类型的实例变量变得有用并且可以毫无问题地使用的情况?提出这样的课程是不好的OOP练习吗?


问题答案:

这样的类一直存在。

考虑链接列表或树,例如,

class ListNode {
  ListNode next;
  // Etc.
}

class TreeNode {
  TreeNode left;
  TreeNode right;
  // Etc.
}

您不会在构造函数中初始化“子”对象,而是稍后添加它们。

在您的示例中,您需要insideCat一个稍后创建的方法。通常,您不会创建状态完全相同的子对象,可能会在构造时有所区别,在这种情况下,您可能会遇到“哦,天哪,现在就停止创建这些对象”的情况,或者当它们处于被添加,例如,您将通过方法而不是在构造函数中添加它们。



 类似资料:
  • 我想做的是,根据文件名(在代码中以字符串的形式)将编译后的类[lets call it ClassA.class]复制到一个新文件(也定义为ClassA中的字符串)[lets call it ClassB.class],并能够使用“javac ClassB”执行新复制的类(使用新文件名)。 做这件事最好、最简洁的方法是什么? 编辑:工作的解决方案...... 十六进制-编辑文件从ClassA到Cl

  • 我试图在我的实体中有两个相同域类的字段,但我得到了这个错误: org.hibernate.mappingException:无法确定表:Outhories中:com.packt.webapp.domain.user的类型,列:[org.hibernate.mapping.column(author)] 我只想将意见映射到已评论的用户,并将评论的作者存储在字段中。当我移除字段时,一切正常。这个例子有

  • java类或关联对象实例可以拥有的字段数量是否有限制?如果有,限制是什么? 我明确地问的是字段,而不是这个问题中所问的方法:一个Java类可以拥有的最大方法数是多少?

  • 问题内容: 好吧,我该怎么做? 我想让一个模型具有对自身的外键引用。当我尝试创建此代码时,我收到django验证错误,该错误尚未定义Example。 问题答案: 你应该用

  • 我只看到两种方法: 将所有字段设置为受保护(或包可见性) 为所有字段生成50个getter 创建50个委托方法来获取这些字段的状态,而不是整个对象的状态 在正常情况下,我会选择最后一个(尽管我真的不想仅仅出于测试的原因而改变界面)。但是在我的类中编写50个新方法只是为了测试真的有意义吗?在这种情况下,将字段设置为受保护的不是更好吗,因为有这么多方法,类会变得不清楚? 注意。反射是我想使用的最后一个