static, final, static final - правильное использование и когда их использовать?

Я хотел бы узнать, когда вы должны использовать static, final, static final параметры для переменных и (или) методов. Насколько я понимаю:

  • final: используется аналогично параметру const в C++. В основном это означает, что значение (или в методах - возвращаемое значение) не изменится.
  • статический: это означает, что значение (или метод) не присваивается непосредственно какому-либо объекту, поэтому вы можете использовать статическую переменную (или метод) в других классах без создания объекта
  • final static: означает ли эта комбинация, что у вас есть переменная (или метод), к которой вы можете получить доступ, не создавая объект (static), и вы не можете изменить ее значение (как в c++ const) (final)

Если я прав, то я ничего не понимаю. В IntelliJ IDE, когда вы объявляете метод как public final static, он указывает, что final следует удалить, потому что static уже указан. Почему, как, когда???


person user3178137    schedule 06.05.2014    source источник
comment
Я не знаю, что вы подразумеваете под изменить его значение для метода, но метод final — это метод, который нельзя переопределить.   -  person Alexis C.    schedule 06.05.2014
comment
@ZouZou под этим я подразумеваю, например: final String hello = Hello; И затем в каком-то методе, когда мы пытаемся изменить значение string hello, мы получаем ошибку, так как оно было объявлено как окончательное значение.   -  person user3178137    schedule 06.05.2014
comment
Да, я говорил о ваших рассуждениях о методах.   -  person Alexis C.    schedule 06.05.2014
comment
Статические методы нельзя переопределить, их можно только затенить/скрыть. Финал лишний.   -  person Dave Newton    schedule 06.05.2014


Ответы (1)


static означает, что поле или метод принадлежит классу, а не отдельным экземплярам класса.

final на самом деле означает разные вещи применительно к методам и полям (или локальным переменным):

  • final переменные и поля не могут быть переназначены. Это довольно похоже на const C++.
  • Методыfinal нельзя переопределить, это относится только к методам экземпляров. При использовании в этом смысле final не похож на const в C++.

Поскольку вы не можете переопределить методы static в классах, комбинированные модификаторы static final обычно избыточны, поэтому IntelliJ рекомендует вам удалить один из модификаторов.

Дополнительные замечания:

  • final переменные и поля могут ссылаться на экземпляры, которые могут изменяться, даже если сами ссылки не могут измениться.
  • Хотя вы не спрашивали о классах, final имеет здесь третье значение: final классы не могут быть подклассами. static также может применяться к вложенным классам (классы внутри классов), но имеет то же значение: static вложенный класс не принадлежит ровно одному экземпляру включающего класса, как это было бы в противном случае.
  • Хотя static методов нельзя переопределить, существует похожее поведение, называемое "затенением" или "скрытием методов", , с помощью которого подкласс предлагает статический метод с тем же именем и сигнатурой, что и подкласс. Это ведет себя иначе, чем переопределение, но аналогичным образом static final методы не могут быть затенены.

Связанный вопрос SO: "Плохо ли объявлять окончательный статический метод?"

person Jeff Bowman    schedule 06.05.2014
comment
it makes no sense to have a static final method static методы нельзя переопределить, но можно скрыть. Делая их final, вы даже не сможете спрятаться. - person Pshemo; 06.05.2014
comment
@Pshemo Достаточно честно. Обновлено. - person Jeff Bowman; 06.05.2014