java StackOverflowError при создании локальных и экземпляров объектов

Привет, кто-нибудь может объяснить мне, почему этот фрагмент кода дает мне StackOverflowError. Я очень признателен, если вы можете объяснить, что происходит, когда instanceObj инициализирует и вызывает конструктор ObjectTest и конструктор java.lang.Object. Мне кажется, что конструктор ObjectTest зацикливается снова и снова, но я не знаю точной причины? Итак, любое предложение ...


public class ObjectTest {

  public ObjectTest() {

   }


  ObjectTest instanceObj = new ObjectTest();


  public static void main(String[] args) {

     ObjectTest localObj = new ObjectTest();
   }
}

person ddfnfal    schedule 09.09.2010    source источник
comment
@all Спасибо за вашу помощь. Я прочитал все ваши сообщения, получил некоторые знания и решил свою проблему.   -  person ddfnfal    schedule 12.09.2010
comment
Возможный дубликат Почему я получаю StackOverflowError   -  person ddfnfal    schedule 20.11.2018


Ответы (4)


Посмотрим, что будет выполнено:

  1. main() создать новый экземпляр ObjectTest
  2. класс ObjectTest имеет поле instanceObj, которое будет содержать ObjectTest
  3. instanceObj инициализируется новым ObjectTest
  4. перейти к шагу 2

Думаю, вам хотелось чего-то большего:

public class ObjectTest {
    private static ObjectTest instanceObj;

    private ObjectTest() {
    }

    public static ObjectTest getInstance() {
        if (instanceObj != null) {
            instanceObj = new ObjectTest();
        }
        return instanceObj;
    }

    public static void main(String[] args) {

        ObjectTest localObj = ObjectTest.getInstance();
    }
}

Или это :

public class ObjectTest {
    private static final ObjectTest instanceObj = new ObjectTest();

    private ObjectTest() {
    }

    public static ObjectTest getInstance() {
        return instanceObj;
    }

    public static void main(String[] args) {

        ObjectTest localObj = ObjectTest.getInstance();
    }
}

Это паттерн Синглтон.


По той же теме:

person Colin Hebert    schedule 09.09.2010

Вы вызываете конструктор, чтобы создать новый экземпляр вашего объекта. У него есть ссылка на другой экземпляр, который вы инициализируете другим новым экземпляром ObjectType, который, в свою очередь, делает то же самое. это бесконечное количество вызовов, пока вы не получите эту ошибку.

Это сработает.

public class ObjectTest { 

  public ObjectTest() { 

   } 


  public static void main(String[] args) { 

     ObjectTest localObj = new ObjectTest(); 
   } 
} 
person duffymo    schedule 09.09.2010

Каждый ObjectTest экземпляр ссылается на другой ObjectTest с именем instanceObj. Этот экземпляр создается при создании его «родительского» экземпляра и, таким образом, приводит к созданию еще одного и еще одного до бесконечности.

Вот эквивалентный код, который может более четко указать на недостаток:

public class ObjectTest {

  ObjectTest instanceObj;

  public ObjectTest() {
    instanceObj = new ObjectTest(); /* Recursively call the constructor. */
  }

}
person erickson    schedule 09.09.2010

Потому что вы рекурсивно создаете себя.

Вам необходимо внедрить свой экземпляр или поручить другому классу управлять этим свойством.

public class ObjectTest {

 public ObjectTest() {
    instanceObj  = null;
 }
 public ObjectTest(ObjectTest myObjectTest) {
     instanceObj = myObjectTest;
 }
}
person Nix    schedule 09.09.2010
comment
В каком разделе спецификации Java это объясняется? - person chrisrhyno2003; 21.10.2015