Class Test {
Test variable1 = null;
Test variable2 = new Test();
}
我們可以用兩個變量執行類似的功能嗎?在同一個類中創建一個類的引用變量是否正確?與使用新關鍵字創建的常規對象有什麼不同?
Class Test {
Test variable1 = null;
Test variable2 = new Test();
}
我們可以用兩個變量執行類似的功能嗎?在同一個類中創建一個類的引用變量是否正確?與使用新關鍵字創建的常規對象有什麼不同?
如果這些成員中的每一個都用new Test()
進行初始化,那麼最終會以無限遞歸。所以不,這不可能。
遞歸必須在某處停止,例如,用空值。
除此之外,具有與類本身相同類型的實例變量沒有任何問題。這是一個完全正常的變量。
在 同一類中創建類的引用變量是否正確?
是的,這是正確的
會讓您更明白一個例子,考慮你有一個類人:
class Person {
String name;
int age;
Person mother;
Person father;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public Person(String name, int age, Person mother, Person father) {
this.name = name;
this.age = age;
this.mother = mother;
this.father = father;
}
}
每個人是有母親和父親一人,母親和父親是人。
例如您:
Person p1 = new Person("Son Name", 22,
new Person("Mother name"), 45), new Person("Father name"), 50));
或者你可以這樣創建:
Person mother = new Person("Mother name", 45);
Person father = new Person("Father name", 50);
Person son = new Person("Son name", 22, mother, father);
就像你看到的,你可以用你的構造玩,就像你想要的。
nope @Aganju這是不正確的 –
@Aganju檢查我已經提到的例子,你會明白,這不是'導致無限遞歸':) –
@Aganju術語「參考變量」在這裏是不正確的。你的意思是一個實例變量。它只會導致無限遞歸,如果它直接分配給一個實例,而該實例又會導致創建相同類或子類的對象。如果要分配給變量的對象被傳遞給構造函數或者在構造之後分配,這不是問題。 –
你只擁有一個無限循環(堆棧溢出錯誤),如果你試圖做到以下幾點:
Class Test {
Test variable2 = new Test();
}
目前您的變量是實例變量,這意味着它們具有Test
實例屬於如果你創建它。但是,variable2
總是會導致一個stackoverflow錯誤。假設你做new Test()
:
Test t1 = new Test(); - > t1.variable1初始化爲null,t1.variable2初始化爲new Test(); - > t1.variable2.variable2初始化爲新的Test(); ...
它不停地遞歸。所以直接初始化實例變量不是一個選項。你必須通過setter或構造函數初始化它。這是完全有效的。一個類可以擁有自己類型的實例成員。畢竟,面向對象的用例有些東西可以包含一個或多個本身的實例。一個樹結構將是一個典型的例子:每個節點可以包含多個子節點,這些子節點又可以包含更多的子節點。
請注意,如果你做這些靜態的,你將能夠立即初始化實例:
Class Test {
static Test variable1 = null;
static Test variable2 = new Test();
}
這些將被靜態成員,與測試屬於類,而不是特定的測試例如 。
什麼時候你會停止定義Test對象? – synchronizer
'variable2'將導致StackOverflowException,因爲*在創建時*每個Test實例都需要自己的Test實例,這需要自己的Test實例,依此類推。 – Pshemo
要清楚,可以將具有與類相同類型的引用變量。正因爲如此,我們可以擁有像LinkedList這樣的結構,它內部具有'Node',用於保存對另一個Node的引用。問題的實質是,在'variable2'中你正在用你的類的另一個實例初始化它。這個初始化將移動到每個構造函數,這將導致無限遞歸和堆棧溢出。 – Pshemo