
1. Вызываются все статические блоки инициализации по очереди от предка к потомку
2. Вызываются попарно динамические блоки инициализации и конструкторы по очереди от предка к потомку.
Статический блок инициализации родителя один для всех наследников. Выполняется только один раз.
class Car {
static { System.out.println("Car: Static block"); }
{ System.out.println("Car: Dynamic block"); }
Car() {
System.out.println("Car: Constructor");
}
Car(String model) {
System.out.println("Car: Constructor. My model is " + model);
}
}
class FastCar extends Car {
static String color;
int topSpeed;
static {
color = "red";
System.out.println("FastCar: Static block");
}
{
topSpeed = 400;
System.out.println("FastCar: Dynamic block");
}
FastCar(String model) {
super(model); // Если закомментировать, вызовется Car();
System.out.println("I'm FastCar. My Top speed is "
+ topSpeed + " km/h. My color is " + color);
}
}
class Lorry extends Car {
static String color;
int topSpeed;
static {
color = "gray";
System.out.println("Lorry: Static block");
}
{
topSpeed = 186;
System.out.println("Lorry: Dynamic block");
}
Lorry() {
System.out.println("I'm Lorry. My Top speed is "
+ topSpeed + " km/h. My color is " + color);
}
}
class Main {
public static void main(String[] args) {
new FastCar("Saleen S7 Twin Turbo");
System.out.println("---------------------");
new Lorry();
}
}
/*
Car: Static block <- Вызвался только один раз при вызове первого потомка.
FastCar: Static block
Car: Dynamic block
Car: Constructor. My model is Saleen S7 Twin Turbo
FastCar: Dynamic block
I'm FastCar. My Top speed is 400 km/h. My color is red
---------------------
Lorry: Static block
Car: Dynamic block
Car: Constructor
Lorry: Dynamic block
I'm Lorry. My Top speed is 186 km/h. My color is gray
*/