类可以有自己类型的字段吗



我做了以下操作,一段时间后我得到了一个stackoverflow错误,我理解为什么会这样。

public class Cat {
    String name="default name";
    Cat insideCat;
    public Cat(){
         System.out.println("Cat constructor");
         insideCat = new Cat();
    }
}

但是,如果我不在构造函数中创建一个新的Cat对象,而是取一个Cat类型的参数并将其分配给内部Cat字段,该怎么办。

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允许创建自己类型的实例变量?我想构造函数的全部目的是初始化它的实例变量。所以要么我必须创建一个新对象来初始化内部Cat,要么我必须从外部获取Cat对象。两者似乎都不起作用。

我在这里错过了什么。是否存在其自身类型的实例变量可以变得有用,并且可以毫无问题地使用的情况?提出这样的课程是一种糟糕的OOP实践吗?

像这样的类一直存在。

考虑链表或树,例如

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

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

在您的示例中,您需要一个稍后创建insideCat的方法。通常,你不会创建具有完全相同状态的子对象,在构建时会有一些东西来区分它们,在这种情况下,你可以有一个"哦,天哪,现在停止创建这些"的条件,或者在添加它们时,例如,你会通过一个方法而不是在构造函数中添加它们。

拥有同一类的实例成员并没有错。一名员工有一名经理,该经理也是一名员工

 public class Employee{
     private Employee manager;
     //getters setters and constructor
 }

有许多自引用数据结构的例子是有效的。想象一下LinkedList。每个LinkNode都有一个数据字段和一个指向下一个LinkNode的指针。

class LinkNode {
    int data;
    LinkNode nextLink;
    public LinkNode(int d1) {
        data = d1;
        nextLink = null;
    }
    ...
}
class LinkedList {
    private LinkNode first;
...
}

你的StackOverflow问题源于这样一个事实,即创建一个而不是X需要无限创建另一个X ,

想想你的Cat例子。为什么实例化一只猫需要所有的东西。。。又一个Cat

可以有多个构造函数。因此,您可以拥有另一个构造函数

public Cat(){...}

这将允许您创建一个内部Cat。之后,您可以创建另一个包含内部Cat的Cat。显然,根据您的需要,这里的设计可能不太好。Dave Newton关于链表的回答是这个用法在现实世界中的一个很好的例子。

最新更新