2017-02-01 2 views
-1

Я начинаю на Java и придерживаюсь простой концепции инициализации вызовов данных и конструкторов, когда в определении класса имеется статический член.статическая и нестационарная инициализация данных элемента и порядок конструктора

Код:

class Bowl { 
    Bowl(int marker) { 
     System.out.println("Bowl(" + marker + ")"); 
    } 
    void f1(int marker) { 
     System.out.println("f1(" + marker + ")"); 
    } 
} 
class Table { 
    static Bowl bowl1 = new Bowl(1); 
    Table() { 
     System.out.println("Table()"); 
     bowl2.f1(1); 
    } 
    void f2(int marker) { 
     System.out.println("f2(" + marker + ")"); 
    } 
    static Bowl bowl2 = new Bowl(2); 
} 
class Cupboard { 
    Bowl bowl3 = new Bowl(3); 
    static Bowl bowl4 = new Bowl(4); 
    Cupboard() { 
     System.out.println("Cupboard()"); 
     bowl4.f1(2); 
    } 
    void f3(int marker) { 
     System.out.println("f3(" + marker + ")"); 
    } 
    static Bowl bowl5 = new Bowl(5); 
} 
class StaticInitialization { 
    public static void main(String[] args) { 
     System.out.println("Creating new Cupboard() in main"); 
     new Cupboard(); 
     System.out.println("Creating new Cupboard() in main"); 
     new Cupboard(); 
     table.f2(1); 
     cupboard.f3(1); 
    } 
    static Table table = new Table(); 
    static Cupboard cupboard = new Cupboard(); 
} 

Выход:

Bowl(1) 
Bowl(2) 
Table() 
f1(1) 
Bowl(4) 
Bowl(5) 
Bowl(3) 
Cupboard() 
f1(2) 
Creating new Cupboard() in main 
Bowl(3) 
Cupboard() 
f1(2) 
Creating new Cupboard() in main 
Bowl(3) 
Cupboard() 
f1(2) 
f2(1) 
f3(1) 

Я не могу понять поток кода и там не так много объяснений в книге, где этот код оказался исключением того, что статические члены инициализируются когда они не были инициализированы до и когда это необходимо. Любые провода?

+0

Все объяснения вы найдете в документе спецификации языка Java. – Andremoniy

+0

Посмотрите здесь: https://docs.oracle.com/javase/specs/jls/se8/html/jls-12.html#jls-12.4.2 – Thomas

ответ

3

При запуске программы,

1) StaticInitialization класс загружается в память и его статические поля инициализируются первыми в том порядке, они описаны

2) Статическое поле таблица инициализируется, поэтому Таблица класс загружается в память, и все его статические поля инициализируются.

3) Статическое поле bowl1 инициализируется, поэтому Чаша класс загружается в память, но это не имеет статические поля, так что конструктор вызывается и печатает Чаша (1)

4) Статическое поле bowl2 инициализируется, но Bowl класс уже загружен, поэтому его конструктор называется просто и печатает Bowl (2)

5) Таблицы конструктора вызывается, печатает таблицы() и вызывает метод f1 (1)

6) Статическое поле шкаф в можно инициализировать StaticInitialization класса, именно поэтому Тумбы класса загружается в память, и все его статические поля инициализируются.

7) Статическое поле bowl4 инициализируется, но Чаша класса уже загружен, поэтому Чаши конструктора вызывается и печатает чаша (4)

8) То же самое с bowl5 статическими поле.

9) Затем, после того, как все статические поля шкафа инициализированы, члены класса инициализируются, то есть bowl3.Так, Чаша конструктор вызывается и печатает Чаша (3)

10) Тумба конструктор вызывается, печатает Тумба() и вызовы f1 (2) метод

11) Основной метод начинает работать. Печать Создание ... и создает новый Шкаф, поэтому члены класса Бутылки. То есть, bowl3 поле инициализируется внутри этого нового объекта и его конструктор называется, поэтому Шар (3) печатается.

12) Конструктор этого нового Шкаф объекта называется, он печатает Cupboard() и вызывает f1 (2) метод bowl3 объекта

13) Шаги 11 и 12 повторяются , (Основной распечатывает Создание ... и создает новый Тумба объект)

14) f2 (1) и f3 (1) методы называются по одному на различных объектах

Просто помните, что статические поля инициализируются один раз, когда класс загружает в память, а члены класса инициализируются по умолчанию, когда объект создан.

+0

Ответ на спасательную жизнь. Ясный и ясный. – vvs14

Смежные вопросы