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

标签 java oop object

我做了以下操作,一段时间后出现了 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/

相关文章:

java - 这是计算对象实例的有效方法吗?

java - 如何停止单击相同的底部导航项?

javascript - 数组和对象作为数据库

java - 这个Java HashMap 有什么问题吗?

python - 一个Python类可以不继承多个类,而是有一个 "choice"的继承吗?

c++ - 将基类传递给接收父类(super class)的函数委托(delegate)

c# - 只运行一次的类是否应该包含静态构造函数?

javascript - 编写一个函数,返回其对应的所有键的所有值的数组

java - hibernate Spring 事务

Java-什么可以通过接口(interface)完成而不能通过抽象类完成?