Объявление не должно объявлять «значение» переменной; это объявить тип переменной.
Назначение - это просто сохранение значения в переменной.
Инициализация - это присвоение значения переменной во время объявления .
Эти определения также применяются к полям.
int i; // simple declaration
i = 42 // simple assignment
int[] arr = { 1, 2, 3 };
// declaration with initialization, allows special shorthand syntax for arrays
arr = { 4, 5, 6 }; // doesn't compile, special initializer syntax invalid here
arr = new int[] { 4, 5, 6 }; // simple assignment, compiles fine
Однако, следует отметить, что «инициализация» также имеет более мягкое определение «первого присваивания переменной», независимо от того, где это происходит.
int i; // local variable declaration
if (something) i = 42;
System.out.println(i);
// compile time error: The local variable i may not have been initialized
Это, однако, компилируется:
int i; // the following also compiles if i were declared final
if (something) i = 42;
else i = 666;
System.out.println(i);
Здесь i
можно «инициализировать» из двух возможных мест с помощью простых назначений. Из-за этого, если i
был массивом, вы не можете использовать специальный синтаксис сокращений инициализатора массива с этой конструкцией.
Таким образом, в основном, «инициализация» имеет два возможных определения в зависимости от контекста:
- В самом узком виде это когда присвоение комбинируется с объявлением.
- Это позволяет, среди прочего, специальный синтаксис инициализации сокращенного массива
- В более общем смысле, это когда присваивание переменной впервые.
- Позволяет, среди прочего, присваивать переменную
final
в нескольких местах.
- Компилятор сделает все возможное, чтобы гарантировать, что может произойти ровно одно из этих назначений, таким образом "инициализируя" переменную
final
Также есть класс JVM-контекста и инициализация экземпляра, инициализация объекта OOP-контекста и т. Д.