Почему конечная переменная не требует инициализации в основном методе в java?

Когда я просто пытаюсь выполнить некоторую программу в Java. Я пытаюсь использовать переменную final, я знаю, что переменная final должна быть инициализирована во время объявления, но внутри Основной метод принимает переменную final без инициализации. Я не знаю, в чем причина. Может кто-нибудь рассказать мне причину.

Спасибо

код:

class name
{
     final int b; //here shows error
     public static void main(String args[])
    {
        final int a; // here no error... why?
        System.out.println("hai");
    }
}

Ответ 1

Для уровня переменной экземпляра

  • Конечная переменная может быть инициализирована только один раз.

  • Конечная переменная на уровне класса должна быть инициализирована до конца конструктора.

Для локального (метода) уровня

  • Конечная переменная на уровне метода может быть инициализирована только один раз.
  • Он должен быть инициализирован до его использования

Итак, в основном, если вы не используете локальную конечную переменную, вы также можете пропустить ее инициализацию.

Если переменная находится на уровне экземпляра, вы должны инициализировать ее в определении или в тесте структуры.

В вашем коде есть переменная экземпляра final int b, которая никогда не инициализируется, поэтому у вас есть ошибка.

У вас также есть локальная переменная final int a, которая никогда не используется. Поэтому у вас нет ошибки для этой переменной.

Ответ 2

Ответ представлен в JLS.

Переменная может быть объявлена ​​окончательной. Конечная переменная может быть назначена только один раз. Это ошибка времени компиляции, если назначена конечная переменная, если она не определена сразу перед назначением.

Что такое окончательное назначение

Теперь, если локальная переменная, область действия действительна внутри объявленного блока. И поток будет линейным (сверху вниз). Поэтому компилятор может легко идентифицировать, где сначала будет инициализирована переменная.

Но в случае field невозможно определить, какой метод будет сначала назначать переменную, если это не присвоение в Constructor.

Итак, вы должны назначить final fields во время объявления или в конструкторе.

Ответ 3

Локальная переменная не имеет значения по умолчанию справа, bt мы можем объявить как это

final int a; нет ошибки но мы не можем получить к нему доступ. когда мы пытаемся получить к нему доступ, возникает ошибка. Но этот случай не относится к переменной класса.

Итак, в вашем случае, когда вы получаете доступ к печати значения переменной, возникает ошибка. Благодаря