[英]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.