Java. Порядок инициализации полей и блоков класса и Интерфейсов

Разберем порядок инициализации:


public class A {
{
System.out.println("A class. No static block 1");
}

{
System.out.println("A class. No static block 2");
}

static {
System.out.println("A class. Static block 1");
}

public static String a1 = psv("a1");

public String a11 = pnsv("a11");

static {
System.out.println("A class. Static block 2");
}

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;
}

static {
System.out.println("A class. Static block 3");
}

{
System.out.println("A class. No static block 3");
}

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");

}

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

public B(int b) {
this.b = b;
}

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

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

public static void methodB() {
System.out.println("B class. Static methodB");
}

public B() {
System.out.println("B class. Constructor");
}

static {
System.out.println("B class. Static block 2");
}
}

а)Простая инициализация, без наследования при вызове конструктора:

Вызываем конструктор:
public class Main {
public static void main(String[] args) {
new A();
}
}
Вывод на консоль:
A class. Static block 1
A class. Static perem a1
A class. Static block 2
A class. Static perem a2
A class. Static block 3
A class. Static perem a3
A class. No static block 1
A class. No static block 2
A class. No static perem a11
A class. No static block 3
A class. No static perem a22
A class. No static block 4
A class. No static perem a33
A class. Constructor
Вывод:
1. Инициализация статических полей и блоков в порядке объявления (один раз)
2. Нестатические поля и блоки в порядке объявления
3. Конструктор

б)Простая инициализация, без наследования при вызове нескольких конструкторов:

public class Main {
public static void main(String[] args) {
new A();
new A();
}
}
Вывод на консоль:
A class. Static block 1
A class. Static perem a1
A class. Static block 2
A class. Static perem a2
A class. Static block 3
A class. Static perem a3
A class. No static block 1
A class. No static block 2
A class. No static perem a11
A class. No static block 3
A class. No static perem a22
A class. No static block 4
A class. No static perem a33
A class. Constructor
A class. No static block 1
A class. No static block 2
A class. No static perem a11
A class. No static block 3
A class. No static perem a22
A class. No static block 4
A class. No static perem a33
A class. Constructor
Вывод:
1. Инициализация статических полей и блоков в порядке объявления (один раз)
2. Нестатические поля и блоки в порядке объявления
3. Конструктор
4. Нестатические поля и блоки в порядке объявления
5. Конструктор

в)Простая инициализация, без наследования при статического поля:

public class Main {
public static void main(String[] args) {
String s = A.a1;
}
}

Вывод на консоль:
A class. Static block 1
A class. Static perem a1
A class. Static block 2
A class. Static perem a2
A class. Static block 3
A class. Static perem a3
Вывод:
1. Инициализация статических полей и блоков в порядке объявления (один раз)

г)Простая инициализация, без наследования при вызове нескольких статических полей:


public class Main {
public static void main(String[] args) {
String s = A.a1;
String s2 = A.a1;
}
}
Вывод на консоль:
A class. Static block 1
A class. Static perem a1
A class. Static block 2
A class. Static perem a2
A class. Static block 3
A class. Static perem a3
Вывод:
1. Инициализация статических полей и блоков в порядке объявления (один раз), те вывод на 
консоль не изменился

д)Простая инициализация, с наследованием, при вызове конструктора

Вызываем конструктор:
public class Main {
public static void main(String[] args) {
new B();
}
}

Вывод на консоль:
A class. Static block 1
A class. Static perem a1
A class. Static block 2
A class. Static perem a2
A class. Static block 3
A class. Static perem a3
B class. Static block 1
B class. Static block 2
A class. No static block 1
A class. No static block 2
A class. No static perem a11
A class. No static block 3
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. Инициализация статических полей и блоков в порядке объявления (один раз) подкласса B
3. Нестатические поля и блоки в порядке объявления в суперклассе А
4. Конструктор суперкласса А
5. Нестатические поля и блоки в порядке объявления в суперклассе B
6. Конструктор подкласса В

Комментарии

Популярные сообщения из этого блога

Java. Лучшая практика работы с Enum

Java. Разбор класса Collections