Когда можно создать объект класса внутри метода этого класса? - программирование
Подтвердить что ты не робот

Когда можно создать объект класса внутри метода этого класса?

public class TestClass(){
    public static void main(String []args) {
        TestClass t1 = new TestClass();
        t1.anything();
    }
}

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

4b9b3361

Ответ 1

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

Нет, основной метод запускается только один раз при запуске вашей программы. Он не будет выполнен снова. Таким образом, объект будет создан только один раз.

Подумайте о том, что ваш основной метод должен быть вне вашего класса. Что создает экземпляр вашего класса и использует созданный экземпляр. Итак, когда вы создаете экземпляр из основного метода, конструктор вызывается для инициализации состояния вашего экземпляра, а затем, когда конструктор возвращается, выполняется следующий оператор вашего основного метода.

Собственно, вы можете рассматривать основной метод, чтобы не быть частью состояния вашего класса.

Однако, если бы вы создали экземпляр своего класса внутри вашего конструктора (скажем, 0-arg) и ссылку в качестве ссылочной переменной экземпляра, то это превратится в бесконечную рекурсию.

public class A {
    private A obj;
    public A() {
        obj = new A();  // This will become recursive creation of object.
                        // Thus resulting in StackOverflow 
    }
}

Ответ 2

Если вы попытаетесь сделать следующее, у вас будет только бесконечный цикл (ошибка):

public class TestClass {
    public TestClass() {
        TestClass t = new TestClass();
    }
}

И в другом месте вы пытаетесь создать объект класса TestClass.

Ответ 3

Это не очень странно. Все объектно-ориентированные языки, о которых я знаю, позволяют это. Код семантически является частью определения объекта, но на практике его можно рассматривать отдельно от фактического состояния любого данного объекта. Таким образом, нет цикла, потому что построение объекта не вызывает ваш метод (если, конечно, это не так), то у вас есть проблема).

Ответ 4

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

Ответ 5

При запуске программы выполняется основной метод. В java вы не можете создать метод вне класса. Все методы должны быть инкапсулированы внутри класса. Поэтому основной метод в качестве точки входа в программу должен находиться внутри класса. Когда вы запустите эту программу, основной метод будет запускаться один раз и будет выполнять код внутри него. В вашем случае он создает объект охватывающего класса TestClass. Это не должно произойти. Он также может создавать объекты за пределами этого класса. Вы получите бесконечный цикл, как описано в ответе @adarshr.

Ответ 6

public class TestClass{
  public static void main(String []args) {
    TestClass t1 = new TestClass();
    t1.anything();
  }
}

Это совершенно правильный код. Когда вызывается метод main, предшествующий экземпляр TestClass не существует (ему не нужно, потому что метод main static).

public class Test2{
  public Test2 clone(){
    return new Test2();
  }
}

Это совершенно справедливо. Когда вы создаете новый экземпляр Test2, он содержит метод clone, но метод не выполняется автоматически. Только при вызове метода clone создается еще один экземпляр Test2.

public class MyLinkedList{
  MyLinkedList next;
  MyLinkedList(int elems){
    if(elems>0){
      next = new MyLinkedList(elems-1);
    }else{
      next = null;
    }
  }
}

отлично действует, даже если конструктор создает новый экземпляр с использованием одного и того же конструктора, потому что создание защищено условным выражением, поэтому создание экземпляра иногда запускает новое создание.

public class Fail{
  public Fail(){
    new Fail();
  }
}

Это единственный проблемный пример. Компилятор не жалуется. Он может быть переведен в байтовый код и может быть выполнен. Однако во время выполнения вы вызываете переполнение стека:

  • выделен новый Fail
  • его конструктор no-arg называется
  • конструктор пытается создать новый Fail
  • выделен новый Fail
  • его конструктор no-arg называется
  • ...

Компилятор допускает это, потому что, в общем, компилятор не может предотвратить всю бесконечную рекурсию. Компилятор допускает все, что может быть переведено в байт-код.

Однако компилятор может выдать предупреждение, если он обнаруживает метод или цепочку методов, которая безоговорочно вызывает себя.