Каковы значения по умолчанию для переменных в Java?

Ответ

В Java значения по умолчанию присваиваются автоматически только полям класса (переменным экземпляра и статическим переменным). Локальные переменные методов не инициализируются по умолчанию, и их использование без явной инициализации приводит к ошибке компиляции.

Таблица значений по умолчанию:

Тип переменной Значение по умолчанию
byte, short, int, long 0
float, double 0.0
char 'u0000' (null-символ)
boolean false
Любой ссылочный тип (Object, String, массив) null

Пример и правило:

public class DefaultValues {
    int instanceVar;       // 0
    static boolean staticFlag; // false
    String name;          // null
    int[] array;          // null

    public void myMethod() {
        int localVar;      // ОШИБКА КОМПИЛЯЦИИ: variable localVar might not have been initialized
        // System.out.println(localVar); // Не скомпилируется

        int initializedLocal = 10; // Корректно
        System.out.println(instanceVar); // Выведет 0
    }
}

Почему такое различие?

  • Поля класса инициализируются для обеспечения предсказуемого состояния объекта после создания.
  • Локальные переменные — это ответственность программиста. Требование явной инициалиции предотвращает ошибки, вызванные использованием «мусорных» значений из стека.

Ответ 18+ 🔞

А, ну вот это классика, блядь! Сидишь такой, пишешь код, и тут — бац! — ошибка компиляции: «variable localVar might not have been initialized». И начинаешь себя чувствовать полным мудаком, ёпта. А всё почему? Потому что в Java, сука, есть чёткое, блядь, разделение: что инициализируется само, а что — нет.

Смотри, тут всё просто, как три копейки. Поля класса — это вот эти переменные, которые прямо в теле класса объявлены. Они, блядь, автоматом получают свои дефолтные значения, когда объект создаётся. Как будто их кто-то за тебя нулями и null-ами нахуярил. Удобно, сука!

А вот локальные переменные — это те, что внутри методов объявляешь. Так вот, про них компилятор думает: «Сам, блядь, разобрался, сам и инициализируй, а то я тебе доверия — ноль ебать». И если ты попробуешь её использовать, не присвоив значение, он тебе сразу в ебало ошибкой: «Чувак, бля, ты чё, это ж мусор из стека может быть!».

Вот табличка, чтобы не забывалось, что чему присваивается:

Тип переменной Значение по умолчанию
byte, short, int, long 0
float, double 0.0
char 'u0000' (пустой символ)
boolean false
Любой ссылочный тип (Object, String, массив) null

А теперь смотри на живом примере, где всё понятно, как божий день:

public class DefaultValues {
    int instanceVar;       // Будет 0, и никуда не денешься
    static boolean staticFlag; // Будет false, хоть тресни
    String name;          // Будет null, жди NullPointerException
    int[] array;          // И это null, естественно

    public void myMethod() {
        int localVar;      // А вот тут, сука, ПИЗДЕЦ! ОШИБКА КОМПИЛЯЦИИ!
        // System.out.println(localVar); // Не скомпилируется, и правильно, блядь!

        int initializedLocal = 10; // А вот так — красота, всё работает
        System.out.println(instanceVar); // Выведет 0, всё по плану
    }
}

А логика-то, блядь, в чём?

  • Поля класса инициализируются, чтобы объект, сука, был в предсказуемом состоянии. Нельзя же его выпускать в мир с какими-то левыми значениями, это ж пиздец.
  • Локальные переменные — это твоя личная зона ответственности, чувак. Требуют явной инициализации, чтобы ты, такой умный, случайно не начал использовать какую-нибудь хуйню из стека, оставшуюся от прошлых вычислений. Предохранитель, блядь, от кривых рук.

Вот и вся философия. Запомни раз и навсегда, чтобы потом не охуевать на ровном месте.