繁体   English   中英

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

[英]Is it okay for a class to have a field of its own type

我做了以下,一段时间后我得到了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的方法。 一般来说,你不会创建具有完全相同状态的子对象,在构造时有一些东西可以区分它们,在这种情况下你可以有一个“哦,上帝停止创建这些现在”的条件,或者它们是添加,例如,您将通过方法而不是在构造函数中添加它们。

拥有相同类的实例成员没有任何问题。 员工有经理,经理也是员工

 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关于链表的答案是这种用法的一个很好的现实世界的例子。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM