Когда java выполняет назначения полей на уровне класса? - PullRequest
0 голосов
/ 14 июля 2020

Я бы считал себя начинающим / средним в программировании; В большинстве случаев мне кажется, что я знаю, как что-то кодировать, но я точно не знаю, что с ним делает java. Иногда у меня есть поле, которое назначается в конструкторе:

public class MyClass {
     public int x;
     
     MyClass() {
       x = 5;
     }
}

... И, насколько я знаю, x получает значение 5 при создании нового объекта MyClass. Однако иногда я назначаю поля вне любого конструктора или функции:

public class MyClass {
     public int x = 5;
     public static MyOtherClass y = new MyOtherClass();
 
     public MyClass() {

     }
}

Когда именно java выполняет эти назначения? Выполняются ли они также при создании объекта MyClass или до этого? Если я ссылаюсь на переменную stati c, такую ​​как «y»:

public class MyThirdClass {
     public MyOtherClass z = MyClass.y;
}

Присваивается ли «y», когда я впервые на нее ссылаюсь, или Java уже сделал это раньше? В этом случае «y» не может быть присвоено после создания нового объекта MyClass, потому что я еще не создал для него никаких объектов. Итак, все ли эти назначения полей вне конструкторов и методов выполняются сразу при запуске программы или вместо этого назначаются при первом обращении / необходимости? Или в другой раз? Спасибо за любую информацию по этому поводу.

1 Ответ

2 голосов
/ 14 июля 2020

Инициализаторы переменных-членов, подобные этому:

public class MyClass {
     public int x = 5;
     public int y;
     
     MyClass() {
       y = 6;
     }
}

встроены во все конструкторы, которые вызывают суперконструктор (неявно или явно), между вызовом суперконструктора и остальной частью тело конструктора:

public class MyClass {
     public int x;
     
     MyClass() {
       super();
       x = 5;
       y = 6;
     }
}

Это не просто инициализаторы переменных-членов: инициализаторы переменных-членов в основном похожи на объявления членов, за которыми следует инициализатор экземпляра:

public int x = 5;

// is the same as

public int x;

{
  x = 5;
}

Все инициализаторы экземпляров в классе встроены в супер-вызывающие конструкторы в том порядке, в котором они объявлены в классе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...