2017-04-20 72 views
0
Class Test { 
    Test variable1 = null; 
    Test variable2 = new Test(); 
} 

我們可以用兩個變量執行類似的功能嗎?在同一個類中創建一個類的引用變量是否正確?與使用新關鍵字創建的常規對象有什麼不同?

+0

什麼時候你會停止定義Test對象? – synchronizer

+1

'variable2'將導致StackOverflowException,因爲*在創建時*每個Test實例都需要自己的Test實例,這需要自己的Test實例,依此類推。 – Pshemo

+0

要清楚,可以將具有與類相同類型的引用變量。正因爲如此,我們可以擁有像LinkedList這樣的結構,它內部具有'Node',用於保存對另一個Node的引用。問題的實質是,在'variable2'中你正在用你的類的另一個實例初始化它。這個初始化將移動到每個構造函數,這將導致無限遞歸和堆棧溢出。 – Pshemo

回答

0

如果這些成員中的每一個都用new Test()進行初始化,那麼最終會以無限遞歸。所以不,這不可能。

遞歸必須在某處停止,例如,用空值。

除此之外,具有與類本身相同類型的實例變量沒有任何問題。這是一個完全正常的變量。

4

在 同一類中創建類的引用變量是否正確?

是的,這是正確的

會讓您更明白一個例子,考慮你有一個類

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); 

就像你看到的,你可以用你的構造玩,就像你想要的。

+1

nope @Aganju這是不正確的 –

+0

@Aganju檢查我已經提到的例子,你會明白,這不是'導致無限遞歸':) –

+2

@Aganju術語「參考變量」在這裏是不正確的。你的意思是一個實例變量。它只會導致無限遞歸,如果它直接分配給一個實例,而該實例又會導致創建相同類或子類的對象。如果要分配給變量的對象被傳遞給構造函數或者在構造之後分配,這不是問題。 –

0

你只擁有一個無限循環(堆棧溢出錯誤),如果你試圖做到以下幾點:

Class Test { 
    Test variable2 = new Test(); 
} 
0

目前您的變量是實例變量,這意味着它們具有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(); 
} 

這些將被靜態成員,與測試屬於類,而不是特定的測試例如

相關問題