2015-09-07 2 views
3

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

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

public static float defaultdim; 
public static final float maxdim; 
public final float mindim; 

Мой IDE, Eclipse, обнаруживает ошибку во второй константы, maxdim, а именно:

заготовки последнее поле maxdim возможно, не было инициализируется

озадачивает меня не то, почему появляется ошибка, но почему ошибка не появляется в случае mindim, который также является окончательным, учитывая сообщение об ошибке связано с тем, что переменная является окончательным. Другими словами, ошибка возникает из-за того, что окончательная переменная не инициализируется во время объявления. Обе переменные являются окончательными, и оба они не инициализируются, но ошибка появляется только в одном случае.

Эти две переменные отличаются модификатором static, что указывает на то, что это послужило бы причиной ошибки. Однако я не понимаю, почему это было бы так, поскольку в случае defaultdim не появляется ошибка, которая является только статической, а не окончательной, и сама ошибка не относится к модификатору static. Может ли кто-нибудь объяснить причину этого мне?

+0

Можете ли вы показать код в конструкторах этого класса? – Nayuki

+0

Ты меня обманываешь? 'static final' var должен иметь начальное значение с его объявлением, поэтому вы получите эту ошибку. –

+0

«У меня есть три постоянных поплавка, значения которых я хочу назначить в конструкторе класса». Это противоречие. Вы знаете, что такое постоянная? – xehpuk

ответ

4

public static float defaultdim;

static поле, которое будет инициализироваться по умолчанию значение 0.0F в случае float, если не указано значение явно. (, т. Е. В случае int он будет иметь 0) Кроме того, это неfinal.

Следующих оба заявления рассматриваются как пустых конечных полех декларации, которые испытывают недостаток в инициализатору.


public static final float maxdim;

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


public final float mindim;

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

public Test(float mindim) { 
    this.mindim = mindim; 
} 

Делая это вы уверены, что компилятор mindim будет инициализирован перед тем, как использовать в любом месте в коде, примечание, что это не static, и он будет иметь различную копию для каждого Object вы создаете для своего класса.

Но что, если мне нужно присвоить значение статическому окончательному полю на основе аргумента, переданного конструктору класса?

No. static final поле Class родственной вещь в то время как конструктор является Object вещи. Ваша константа должна быть инициализирована, когда загружается class, а ваш конструктор будет вызываться при создании Object класса с new. Нет смысла инициализировать константу в конструкторе. Если он может варьироваться в зависимости от каждого объекта, то он определенно не является константой . Да, вы можете сохранить свое поле только final и назначить значение на основе параметра конструктора, потому что таким образом оно будет иметь значение final для каждого Object.

+1

технически все поля сначала инициализируются значениями по умолчанию. поле 'final int x = 1;' фактически включает в себя 2 записи. первая запись (x = 0) может быть наблюдаемой. – ZhongYu

+0

Это объясняет это очень хорошо, спасибо. Но что, если мне нужно назначить значение статическому окончательному полю на основе аргумента, переданного конструктору класса? В моей программе все объекты, созданные из данного класса, будут иметь одинаковое поле defaultdim, а defaultdim не изменяется, что означает, что модификаторы должны быть статичными и окончательными. Однако этот параметр defaultdim может быть определен только из параметра, заданного конструктору. Что делать тогда? – wit221

+0

@ bayou.io Исключение постоянных переменных, которые никогда не имеют значения по умолчанию. – xehpuk

0

Поскольку не являющиеся статические переменные на старте нулевые

Смежные вопросы