Порядок инициализации полей и блоков при наследовании

Есть суперкласс А, от данного суперкласса наследуется подкласс B:

public class A {
	 
    {
        System.out.println("A class. No static block 1");
    }
 
    {
        System.out.println("A class. No static block 2");
    }
 
    {
        System.out.println("A class. No static block 3");
    }
 
    static {
        System.out.println("A class. Static block 1");
 
    }
 
    static {
        System.out.println("A class. Static block 2");
 
    }
    public static String a1 = psv("a1");
     
    public String a11 = pnsv("a11");
 
    static {
        System.out.println("A class. Static block 3");
 
    }
    public static String a2 = psv("a2");
 
    private static String psv(String a) {
        System.out.println("A class. Static perem " + a);
        return a;
 
    }
 
    private String pnsv(String a) {
        System.out.println("A class. No static perem " + a);
        return a;
 
    }
     
    public A() {
    	System.out.println("A class. Constructor");
    }
 
 
    public String a22 = pnsv("a22");
 
    public static String a3 = psv("a3");
     
    {
        System.out.println("A class. No static block 4");
    }
     
    public String a33 = pnsv("a33");
 
}

И класс B, который наследуется от класса A:

public class B extends A{
	private int b = bb(20);

	public B(int b) {	
		this.b = b;
	}
	
	private int bb(int x) {
		System.out.println("B class. No static perem " + x);
		return 0;
	}

	public B() {
		System.out.println("B class. Constructor");
	}
	
	static {
		System.out.println("B class. Static block 1");
	}
	
	
}

Вызов конструктора у класса B:

public class Test {	
	public static void main(String[] args) {
		new B();
	
	}
}

Вывод на консоль:

A class. Static block 1
A class. Static block 2
A class. Static perem a1
A class. Static block 3
A class. Static perem a2
A class. Static perem a3
B class. Static block 1
A class. No static block 1
A class. No static block 2
A class. No static block 3
A class. No static perem a11
A class. No static perem a22
A class. No static block 4
A class. No static perem a33
A class. Constructor
B class. No static perem 20
B class. Constructor

Т.е. порядок такой:
1. Статические блоки и статические поля в порядке объявления суперкласса(А)
2. Статические блоки и статические поля в порядке объявления подкласса(В)
3. Не статические блоки и не статические поля в порядке объявления суперкласса(А)
4. Конструктор суперкласса(А)
5. Не статические блоки и не статические поля в порядке объявления подкласса(B)
6. Конструктор подкласса(B)

Реклама