Скопируйте код кода следующим образом:
общественный класс Test4 {
@Тест
публичный тест на недействительность(){
ребенок ребенок = новый ребенок ();
}
}
родитель класса {
public static StringparentStaticField = "Статическая переменная родительского класса";
public StringparentNormalField = "Обычная переменная родительского класса";
статический {
System.out.println(parentStaticField);
System.out.println("Статический блок родительского класса");
}
{
System.out.println(parentNormalField);
System.out.println("Обычный блок родительского класса");
}
публичный родитель(){
System.out.println("Конструктор родительского класса");
}
}
дочерний класс расширяет родительский {
public static String childStaticField = "Статическая переменная подкласса";
public String childNormalField = "Обычная переменная подкласса";
статический {
System.out.println(childStaticField);
System.out.println("Статический блок подкласса");
}
{
System.out.println(childNormalField);
System.out.println("Обычный блок подкласса");
}
публичный ребенок(){
System.out.println("Конструктор подкласса");
}
}
Выход:
Скопируйте код кода следующим образом:
статическая переменная родительского класса
Статический блок родительского класса
Статические переменные подкласса
статический блок подкласса
Обычная переменная родительского класса
Обычный блок родительского класса
Конструктор родительского класса
Обычные переменные подкласса
Обычный блок подкласса
Конструктор подкласса
Процесс исполнения:
1. При выполнении нового дочернего элемента загрузчик ищет код скомпилированного дочернего класса (то есть файл child.class). В процессе загрузки загрузчик замечает, что у него есть базовый класс, поэтому загружает базовый класс еще раз. Этот процесс будет происходить всегда, независимо от того, создаете ли вы объект базового класса или нет. Если у базового класса есть другой базовый класс, то будет загружен и второй базовый класс и так далее.
2. Выполните статическую инициализацию корневого базового класса, затем статическую инициализацию следующего производного класса и т. д. Этот порядок очень важен, поскольку «статическая инициализация» производного класса может зависеть от правильной инициализации членов базового класса.
3. Когда все необходимые классы загружены, создайте объект дочернего класса.
4. Если у дочернего класса есть родительский класс, вызывается конструктор родительского класса. Вы можете использовать super, чтобы указать, какой конструктор вызывать.
Процесс построения и последовательность построения базового класса такие же, как и у производного класса. Сначала каждая переменная базового класса инициализируется в буквальном порядке, а затем выполняется остальная часть конструктора базового класса.
5. Инициализируйте данные членов подкласса в том порядке, в котором они объявлены, и выполните остальную часть конструктора подкласса.