java StackOverflowError при создании локальных и экземпляров объектов - PullRequest
0 голосов
/ 09 сентября 2010

Привет, кто-нибудь, пожалуйста, объясните мне, почему этот фрагмент кода дает мне 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();
   }
}

Ответы [ 4 ]

6 голосов
/ 09 сентября 2010

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

Это будет работать.

public class ObjectTest { 

  public ObjectTest() { 

   } 


  public static void main(String[] args) { 

     ObjectTest localObj = new ObjectTest(); 
   } 
} 
3 голосов
/ 09 сентября 2010

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

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

Это шаблон Singleton.


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

3 голосов
/ 09 сентября 2010

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

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

public class ObjectTest {

  ObjectTest instanceObj;

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

}
1 голос
/ 09 сентября 2010

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

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

public class ObjectTest {

 public ObjectTest() {
    instanceObj  = null;
 }
 public ObjectTest(ObjectTest myObjectTest) {
     instanceObj = myObjectTest;
 }
}
...