Java - конечные переменные

Я знаю, что как только конечная переменная имеет назначенное ей значение, ее нельзя изменить. Однако у меня есть несколько вопросов относительно этого:

  • Когда у меня есть поле, скажем static final JButton button; вне класса, а затем в методе main, попробуйте присвоить ему значение button = new JButton("OK");, я получаю сообщение об ошибке, чтобы удалить окончательный модификатор? Однако, поскольку исходная переменная button еще не ссылается на объект, который был у меня под впечатлением, я мог бы назначить его один раз?

  • Во-вторых, если я полностью удалю ссылку на button, поэтому я просто static final JButton button; вне класса, мои требования IDE: "Пустая кнопка конечного поля, возможно, не была инициализирована". Означает ли это, что все конечные поля должны быть инициализированы? И если это так, они должны быть инициализированы там, а затем, как я не могу, похоже, инициализировать его позже.

  • Кроме того, глупый вопрос, но мое первоначальное предположение о том, что когда конечная переменная ссылается на экземпляр или тип данных, он не может быть назначен ни к чему другому, правильно?

Этот код не является полным, но для иллюстрации моей точки:

public class FinalVarTester {

    static final JButton button;

    public static void main(String[] args) {
        JFrame frame = new JFrame();
        Container container = frame.getContentPane();
        container.setLayout(new BorderLayout());
        button = new JButton("OK");
        container.add(button, BorderLayout.SOUTH);
    }

}

Ответ 1

Вы должны инициализировать статическую конечную переменную либо в статическом инициализаторе, либо непосредственно. Поэтому либо

static final JButton button = new JButton();

или

static final JButton button;

static {
  button = new JButton();
}

В спецификации языка Java есть дополнительная документация: раздел о конечных переменных указывает, почему вы получаете ошибку компиляции:

Это ошибка времени компиляции, если назначена конечная переменная, если она определенно не назначена (§16) непосредственно перед назначением.

и глава 16 рассказывает об определенном задании

Ответ 2

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

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

Что касается вашего последнего вопроса, да, вот почему он называется final.

Ответ 3

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

Ответ 4

Проблема заключается в инициализации конечной переменной в методе внутри класса (основной метод тоже метод:)). В java "final" походит на константу, и ее можно было инициализировать только один раз. Делайте это с составом вместо агрегации.

public class FinalVarTester {

    static final JButton button = new JButton("OK");

    public static void main(String[] args) {
        JFrame frame = new JFrame();
        Container container = frame.getContentPane();
        container.setLayout(new BorderLayout());
        container.add(button, BorderLayout.SOUTH);
    }
}

Ответ 5

Правильный ответ заключается в том, что static final var всегда инициализируется во время инициализации класса - либо к указанному вами значению, либо по умолчанию (null, 0, false). p >

Ответ 6

Конечная переменная может быть инициализирована только один раз, либо через инициализатор, либо оператор присваивания. Его не нужно инициализировать в точке объявления: это называется "пустой конечной" переменной.

Типы конечных переменных

1) ИНСТАНЦИЯ ОКОНЧАТЕЛЬНАЯ ПЕРЕМЕННАЯ:

Пусто конечная переменная экземпляра класса должна быть определенно назначена в конце каждого конструктора класса, в котором она объявлена; в противном случае возникает ошибка времени компиляции

2) STATIC FINAL VARIABLE

Чистая конечная статическая переменная должна быть определенно назначена в статическом инициализаторе класса, в котором она объявлена; в противном случае возникает ошибка времени компиляции

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

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

Ссылка: http://en.wikipedia.org/wiki/Final_(Java)

Ответ 7

Лучше приятный путь:

public class FinalVarTester 
{    
    static final JButton button; 
    public FinalVarTester()
    {    
        JFrame frame = new JFrame();
        Container container = frame.getContentPane();
        container.setLayout(new BorderLayout());
        container.add(button, BorderLayout.SOUTH);
        button = new JButton("OK");
    }
    public static void main(String[] args)    
    {
        FinalVarTester vTester = new FinalVarTester();    
    }
}