Короткий ответ
Значения по умолчанию присваиваются полям класса (переменным экземпляра и статическим переменным), если им явно ничего не присвоено. Числовые примитивы получают ноль в своём виде, char — нулевой символ, boolean — false, ссылочные поля (включая String) — null. Локальные переменные исключение: значений по умолчанию у них нет.
Как это работает подробнее
JVM инициализирует поля в момент создания объекта или загрузки класса — ещё до вызова конструктора. То же правило действует для элементов массива: при его создании все ячейки заполняются значениями по умолчанию.
- Числа:
byte,short,int→0;long→0L;float→0.0f;double→0.0d. - Символы и логика:
char→ нулевой символ;boolean→false. - Ссылки: любые поля объектных типов (включая
String) →null, то есть ссылка «ни на что». - Локальные переменные внутри метода не инициализируются автоматически: обращение до присваивания — ошибка компиляции.
Пример кода
Defaults.java
public class Defaults {
int i;
long l;
double d;
char c;
boolean flag;
String s;
public static void main(String[] args) {
Defaults v = new Defaults();
System.out.println(v.i); // 0
System.out.println(v.l); // 0
System.out.println(v.d); // 0.0
System.out.println((int) v.c); // 0 — нулевой символ
System.out.println(v.flag); // false
System.out.println(v.s); // null
}
}Что использовать на практике
- Локальные переменные инициализировать до использования — иначе код не скомпилируется.
- Явно задавать «значащие» начальные значения полям в конструкторе, а не полагаться на умолчания.
- При работе с массивами помнить, что ячейки заполняются автоматически: числами
0, ссылкамиnull.
Подводные камни
- Путать поля и локальные переменные: у локальных значений по умолчанию нет.
- Думать, что у
Stringесть особое «пустое» значение: по умолчанию ссылка равнаnull, а не пустой строке. - Использовать неинициализированные поля в логике до явной установки — легко получить скрытый
nullили0.
Как отвечать на собеседовании
- Каркас ответа: сразу разделите поля (есть умолчания) и локальные переменные (нет) → перечислите значения: числа — 0, char — нулевой символ, boolean — false, ссылки — null → добавьте про статические поля и элементы массивов → приведите пример с полем String.