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