Це основні фактори, що беруть участь:
- змінна члена (за замовчуванням OK)
- статична змінна (за замовчуванням OK)
- кінцева змінна члена (не ініціалізована, повинна бути встановлена на конструкторі)
- кінцева статична змінна (не ініціалізована, має бути встановлена на статичному блоці {})
- локальна змінна (не ініціалізована)
Примітка 1. Ви повинні ініціалізувати змінні остаточного члена на кожному реалізованому конструкторі!
Примітка 2. Ви повинні ініціалізувати змінні остаточного члена всередині блоку самого конструктора, не викликаючи іншого методу, який їх ініціалізує. Наприклад, це НЕ діє:
private final int memberVar;
public Foo() {
init();
}
private void init() {
memberVar = 10;
}
Примітка 3: масиви є об’єктами в Java, навіть якщо вони зберігають примітиви.
Примітка 4: при ініціалізації масиву всі його елементи встановлюються за замовчуванням, незалежно від того, є членом або локальним масивом.
Я додаю приклад коду, представляючи вищезазначені випадки:
public class Foo {
private int a;
private static int b;
private Object c;
private static Object d;
private int[] e;
private static int[] f;
private final int g;
private final static int h;
private final Object i;
private final static Object j;
private final int[] k;
private final static int[] l;
static {
h = 5;
j = new Object();
l = new int[5];
}
public Foo() {
g = 10;
i = new Object();
k = new int[10];
}
public Foo(boolean aBoolean) {
g = 15;
i = new Object();
k = new int[15];
}
public static void main(String[] args) {
int m;
Object n;
int[] o;
m = 20;
n = new Object();
o = new int[20];
}
}