Я делаю некоторые изменения из слайдов лекции, и это говорит, что конструктор выполняется следующим образом:
Если конструктор запускает с этого, рекурсивно выполните обозначенного конструктора, то перейдите к шагу 4.
Вызовите явно или неявно обозначенный конструктор суперкласса (если этот класс не java.lang.Object
).
Инициализируйте поля объекта в порядке, в котором они были объявлены в этом классе.
Выполните остальную часть тела этого конструктора.
То, что я не понимаю, - то, что конструктор никогда не может "запускать" с этого, потому что, даже если это не формирует иерархии/отношений класса затем супер () вставляется по умолчанию.
Как это согласовалось бы с описанием выше?
Конструктор (для каждого класса, кроме java.lang.Object) должен начинаться либо с «super ()», чтобы вызвать конструктор его суперкласса, либо с «this ()» , чтобы вызвать другой конструктор того же класса. Если вы не включите ни один из них в свой конструктор, компилятор вставит вызов super (). Для конструктора нормально начинать с вызова другого конструктора в том же классе, если в конечном итоге вызывается конструктор в классе, который вызывает конструктор суперкласса.
Я не думаю, что вы правы, или я не понимаю в чем проблема. Из Спецификации языка Java :
Если тело конструктора не начинается с явного конструктора вызов и конструктор заявленное не является частью изначального class Object, затем конструктор тело неявно предполагается компилятор, чтобы начать с суперкласса вызов конструктора "super ();", вызов конструктора своего прямой суперкласс, который не принимает аргументы.
Таким образом, конструктор может начинаться с this (...)
, который вызывает другой конструктор того же класса. Только когда вызывается конструктор, который не начинается ни с this (...), ни с super (...), super () вызывается автоматически.
Я бы сказал, что после создания объекта был вызван super (...) (если класс не java.lang.Object).
здесь более или менее практический пример использования this (...)
public class Car {
private final int numberOfDoors;
public Car(int doors) {
numberOfDoors = doors;
}
public Car() {
this(4); // default is 4 doors, calls the constructor above
}
}