2016-05-17 9 views
-2

Я знаю, что переменная, объявленная как это:Почему конечные переменные не являются константами Java?

public class Example { 
    public static final int MY_CONSTANT = 10; 

} 

считается константой Java. Я не понимаю, почему переменная, объявленная только final, не может считаться константой?

+3

_I действительно не понимаю, почему переменная, объявленная только окончательно, не может считаться константой. Вы просите, а не меняете с помощью 'static'? Или не инициализирован при объявлении? Можете ли вы уточнить, в каком случае вы не думаете, что это считается константой? И вы имеете в виду _constant_ как неизменный или вы имеете в виду _constant_ как в _constant expression_, как определено в JLS? –

+2

Я отметил это как дубликат другого вопроса, так как вы задаете точно такой же вопрос, но я должен сказать, что ответы там довольно неудовлетворительны. В частности, [JLS] (https://docs.oracle.com/javase/specs/jls/se8/html/jls-4.html#jls-4.12.4) говорит: «Постоянная переменная является конечной переменной примитивный тип или тип String, который инициализируется константным выражением (§15.28). ", в котором не упоминается' static'. –

+0

@ Энди Тернер: Да, даже локальные переменные могут быть константами. Если вы хотите повеселиться, вы можете использовать такие локальные константы, как 'case' label в инструкции' switch', или ссылаться на них в аннотации локального 'class' ... – Holger

ответ

0

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

Другая причина в том, что вам не нужно создавать объект для доступа к статической переменной. Почему вы должны создать объект для доступа к константе?

+3

Он не будет иметь разных значений, если ему назначено значение, когда оно объявлено: 'final int myConstant = 10;'. –

+0

@AndyTurner: Правда, но не совсем очевидно (в пределах IDE, которые я знаю), как это значение было присвоено. Для 'static final' очевидно, что они имеют постоянную ценность во всей программе. –

+0

@FrankPuffer Почему это более очевидно? В обоих случаях вам нужно будет проверить код или прочитать документацию. –