Почему переменные класса инициализируются до того, как конструктор вызывается, если рассматриваемый класс не расширяет какой-либо другой класс, но конструктор сначала вызван, а инициализация переменных класса выполняется, если рассматриваемый класс расширяет некоторые другие классы!Порядок инициализации в классе
например. допустим, у меня есть класс
public class Windows {
public Windows() {
System.out.println("in window");
}
}
и у меня есть один базовый класс.
public class BaseClass {
public BaseClass() {
System.out.println("in base");
}
}
и, наконец, у меня есть еще один класс.
public class ChildClass extends BaseClass {
Windows w = new Windows();
public ChildClass() {
System.out.println("in subclass");
}
public static void main(String[] args) {
System.out.println(new ChildClass());
}
}
приведет к
в базе в окне в подклассе
, который предполагает, что конструктор базового класса получил под названием, которое означает ChildClass конструктор получил колл, но после того, как BaseClass конструктор закончил , почему поле было инициализировано? то есть она не должна быть чем-то вроде
в базе в подклассе в окне
Это будет объяснить что-то!
Опять же, если я сделать
public class ChildClass {
Windows w = new Windows();
public ChildClass() {
System.out.println("in subclass");
}
public static void main(String[] args) {
System.out.println(new ChildClass());
}
}
я получу
в окне в подклассе
, которые свидетельствуют о том, что до того поля окна конструктора были инициализированы. Смущенный!?!?!? Картинка становится даже запутанной, если я добавляю некоторые статические поля тоже!
Некоторые объяснения состоят в том, что JVM сначала сначала инициализирует материал базового слоя, затем переходит в поля текущего класса и, наконец, конструктор. Это правда?
Некоторые объяснения будут большими !!
Вы могли бы хотеть проверить это: http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.3.2 –
Если только там был какая-то спецификация, которая подробно описывает язык Java, например, спецификацию Java Language Specification. –
Терминология пожалуйста. Здесь нет «переменных класса». Они были бы статичными. Существуют * переменные экземпляра *. – EJP