2016-01-12 2 views
-3

Я просто пытаюсь понять, почему это возможно, но это невозможно в некоторых других языках программирования, таких как C++. Вот пример того, что я спрашиваю:Почему нам разрешено создавать объект класса внутри одного класса?

public class A{ 
    private A objectOfTheSameClass; 
    public A() 
    { 
     objectOfTheSameClass=new A(); 
    } 
} 
+4

Идите и попробуйте, у вас возникнут проблемы, так как вы создадите бесконечный стек экземпляров A и исчерпаете ресурсы. В других случаях, почему мы не можем это сделать? – Stultuske

+0

Я думал, что объект A будет содержать ссылку на себя при создании экземпляра. Я разработал свой собственный LinkedList после учебника, и он использовал ту же технику. Например, удерживая ссылку следующего узла внутри текущего узла –

+0

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

ответ

3

Поскольку это явно не запрещено.

JLS section 8.8.7, который определяет, что тело конструктора не требует ошибки времени компиляции для такого случая. Единственный случай, когда ошибка времени компиляции должна произойти, когда конструктор вызывает себя this:

Это ошибка времени компиляции для конструкторы прямо или косвенно ссылаться на себя через ряд один или более явные вызовы конструктора с участием this.

Более точно:

для возможности явного конструктора вызовов, а также запрет на явно возвращать значение (§14.17) За исключением случаев, тело конструктора, как тело метода (§8.4.7).

Поскольку метод разрешен для вызова себя (рекурсии), конструктору также разрешено делать то же самое.

Это не будет компилироваться, так как он вызывает this:

public class A{ 
    private A objectOfTheSameClass; 
    public A() { 
     objectOfTheSameClass= this(); 
    } 
} 

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

+0

Итак, возможно, если у вас есть другой конструктор с параметрами и создать объект того же класса с использованием конструктора по умолчанию или любого другого конструктора? –

+0

@johndoe Вы можете в значительной степени делать то, что хотите. Единственное, что нельзя назвать одним и тем же конструктором с 'this'. – Tunaki

+0

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

1

Может быть полезно иногда, например, в шаблоне «singleton» используется один экземпляр класса, создавая объект того же класс как поле класса, делая его доступным с помощью общедоступного метода и делая его конструктивным.

Экземпляры не создаются до выполнения, поэтому класс полностью определен. Это зависит от вас, чтобы использовать это правильно.

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