2013-03-26 1 views
-2

Почему ошибка переполнения стека возникает при создании нестатического экземпляра в экземпляре того же класса?Почему ошибка переполнения стека возникает при создании нестатического экземпляра в экземпляре?

public class ObjectTest { 
    ObjectTest instanceObj = new ObjectTest("Outside"); 

    public ObjectTest(String s) { 
     System.out.println(s); 
    } 

    public static void main(String[] args) { 
     ObjectTest localObj = new ObjectTest("Inside"); 
    } 
} 

Но проблема становится решена ниже модификации:

static ObjectTest instanceObj = new ObjectTest("Outside"); 

Подразумевается как циклическую зависимость возникает в первом случае при назначении нового объекта instanceObj ссылки

Может кто-нибудь прояснить все это ?? Почему для статической ссылочной кольцевой зависимости не происходит?

+0

Спасибо всем ... Хотя я знал о статической/нестатической концепции .., но теперь я ясно понял ... Я был немного смущен. Спасибо снова! –

+0

Done Sotirios !! –

ответ

6

Когда instanceObj не является статичным, конструктор для ObjectTest создает другой ObjectTest, который создает другой ObjectTest, и так далее бесконечности. Когда он статичен, только один instanceObj создан для целого класса ObjectTest ... его is статические, в конце концов. :) Когда instanceObj статичен и создается его ObjectTest, он уже имеет статический экземпляр Obj, который сам по себе. Для этого нужно привыкнуть, это может помочь вам разобраться на бумаге и убедиться, что вы поняли, что означает ключевое слово static.

2

Потому что он создает объект внутри объекта и снова объект внутри объекта. Это похоже на бесконечное зеркальное отражение, когда два зеркала остаются впереди друг друга.

О статическом объекте, это не экземпляр класса. статический объект создается на уровне класса.

Мы используем такой статический объект того же класса при разработке класса SingleTon.

1

Поскольку код подвергается почти такой же, как:

public class ObjectTest { 
    ObjectTest instanceObj; 

    public ObjectTest(String s) { 
     instanceObj = new ObjectTest("Outside"); // creating another object executing this constructor again 
     System.out.println(s); 
    } 

    public static void main(String[] args) { 
     ObjectTest localObj = new ObjectTest("Inside"); 
    } 

} 

При изменении поля в статическом поле вы что-то вроде:

public class ObjectTest { 
    static ObjectTest instanceObj; 

    static { 
     instanceObj = new ObjectTest("Outside"); 
    }  

    public ObjectTest(String s) { 
     System.out.println(s); 
    } 

    public static void main(String[] args) { 
     ObjectTest localObj = new ObjectTest("Inside"); 
    } 

} 

выполняет конструктор только один раз.

Смежные вопросы