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

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

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

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

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

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

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);
    }

}

7 ответов


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

static final JButton button = new JButton();

или

static final JButton button;

static {
  button = new JButton();
}

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

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

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


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

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

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


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


проблема заключается в инициализации конечной переменной в методе внутри класса (основной метод тоже метод :) ). В 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);
    }
}

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


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

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

1) КОНЕЧНАЯ ПЕРЕМЕННАЯ ЭКЗЕМПЛЯРА:

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

2) СТАТИЧЕСКАЯ КОНЕЧНАЯ ПЕРЕМЕННАЯ

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

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

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

Ref : http://en.wikipedia.org/wiki/Final_ (Java)


лучший хороший способ кодирования:

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();    
    }
}