[英]Why can't you instantiate the same object of that class inside constructor?
public class Run{
public static void main(String... args){
A a1 = new A();
}
}
class A{
public A(){
A a = new A();
}
//here as well A a = new A();
}
為什么這會給出java.lang.StackOverflowError
? 這里有遞歸調用嗎? 它是怎么發生的?
您正在構造函數內部調用構造函數,這就是new
所做的事情,構造了一個新對象。
這里有遞歸調用嗎?
對
怎么發生的?
當您new A()
,它將調用A
的構造函數,該構造函數執行一個new A()
,該new A()
調用構造函數,該構造函數將執行一個new A()
...依此類推。 那就是遞歸。
您可以調用,但這將是一個無限運行的遞歸調用。 這就是為什么出現StackOverflowError
的原因。
以下將完美地工作:
public class Run{
static int x = 1;
public static void main(String... args){
A a1 = new A();
}
}
class A{
public A(){
if(x==1){
A a = new A();
x++;
}
}
}
問題在於,當您調用構造函數時,會創建一個新對象(這意味着您再次調用該構造函數,因此您創建了另一個對象,因此再次調用了構造函數...)
最佳狀態是無限遞歸,它與構造函數無關(實際上您可以從構造函數創建新對象)。
基本上,您的構造函數都不會退出-每個構造函數都會嘗試遞歸實例化另一個A
類型A
對象。
您需要更改構造函數才能實際創建一個A
對象。 假設A
擁有一個整數值,僅此而已。 在這種情況下,您的構造函數應如下所示:
class A{
int number;
public A(){
number = 0;
}
}
您在代碼中所做的實際上是在自己的構造函數中創建一個新的對象實例。
因此,當您調用new A()
,您正在調用構造函數,該構造函數隨后在其主體內部調用new A()
。 它最終會無限調用自己,這就是堆棧溢出的原因。
我認為那里有一個遞歸調用。 為了創建一個A,您必須在其中創建另一個A。 但是要在其中創建一個A,您必須在該A中創建第三個A。依此類推。 如果使用兩個不同的構造函數或自變量或類似的東西,則應該可以解決此問題:
class A {
public A(boolean spawn){
if (spawn) {
A a = new A(false);
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.