Поскольку это явно не запрещено.
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
. Компилятор не может обнаружить каждый бесконечный цикл в вашем коде ...
Идите и попробуйте, у вас возникнут проблемы, так как вы создадите бесконечный стек экземпляров A и исчерпаете ресурсы. В других случаях, почему мы не можем это сделать? – Stultuske
Я думал, что объект A будет содержать ссылку на себя при создании экземпляра. Я разработал свой собственный LinkedList после учебника, и он использовал ту же технику. Например, удерживая ссылку следующего узла внутри текущего узла –
Почему это не должно быть разрешено? Из вышеизложенного возникнут проблемы, но язык не сможет защитить разработчика от каждой глупой вещи, которую они могут сделать. – Thomas