簡體   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