count
câmpul este static în Counter
clasă, înseamnă că puteți face referire la variabila cu următoarea expresie: Counter.count
. 
private
câmpurile sunt disponibile numai în cadrul clasei în care sunt declarate. Și protected
câmpurile sunt disponibile pentru toate clasele dintr-un pachet, precum și pentru toate subclasele din afara pachetului. Să presupunem că Counter
clasa are o metodă statică increment()
a cărei sarcină este de a incrementacount
camp. Pentru a apela această metodă, puteți utiliza Counter.increment()
. Nu este nevoie să creați o instanță a Counter
clasei pentru a accesa un câmp sau o metodă static. Aceasta este diferența fundamentală dintre variabilele și metodele statice (de clasă) și variabilele și metodele NON-statice (instanță). O notă importantă. Nu uitați că membrii statici ai clasei aparțin direct clasei, nu oricărei instanțe a clasei. Adică, valoarea variabilei statice count
va fi aceeași pentru toate Counter
obiectele. În acest articol, vom analiza aspectele fundamentale ale utilizării modificatorului static în Java, precum și câteva caracteristici care vă vor ajuta să înțelegeți conceptele cheie de programare.
Ce ar trebui să știe fiecare programator despre modificatorul static din Java.
În această secțiune, ne uităm la principalele aspecte ale utilizării metodelor, câmpurilor și claselor statice. Să începem cu variabilele.-
NU POȚI accesa membrii nestatici ai unei clase într-un context static, cum ar fi o metodă sau un bloc static. Compilarea codului de mai jos va duce la o eroare:
public class Counter { private int count; public static void main(String args []) { System.out.println(count); // Compile time error } }
Aceasta este una dintre cele mai frecvente greșeli făcute de programatorii Java, în special de începători. Deoarece
main
metoda este statică șicount
variabila nu, utilizareaprintln
metodei în interiorulmain
metodei va produce o „eroare de timp de compilare”. -
Spre deosebire de variabilele locale, câmpurile și metodele statice NU sunt
thread safe
în Java. În practică, aceasta este una dintre cele mai frecvente cauze ale problemelor de securitate în programarea cu mai multe fire. Având în vedere că fiecare instanță a unei clase face referire la aceeași copie a unei variabile statice, o astfel de variabilă trebuie să fie protejată sau „blocata” de clasă. Prin urmare, atunci când utilizați variabile statice, asigurați-vă că acestea sunt corectsynchronized
pentru a evita probleme precumrace conditions
. -
Metodele statice au un avantaj practic prin faptul că nu este nevoie să creați un nou obiect de fiecare dată când doriți să le apelați. O metodă statică poate fi apelată folosind numele clasei care o declară. De aceea aceste metode sunt perfecte pentru
factory
metode șiutility
metode. Clasajava.lang.Math
este un exemplu minunat: aproape toate metodele sale sunt statice. Clasele de utilitate Java sunt marcatefinal
din același motiv. -
Un alt punct important este că nu puteți suprascrie (
@Override
) metodele statice. Dacă declarați o astfel de metodă într-unsubclass
, adică o metodă cu același nume și semnătură, pur și simplu „ascundeți” metodasuperclass
în loc să o suprascrieți. Acest fenomen este cunoscut sub numele demethod hiding
. Aceasta înseamnă că, dacă o metodă statică este declarată atât în clasele părinte, cât și în clasele secundare, metoda apelată va fi întotdeauna bazată pe tipul variabilei la momentul compilării. Spre deosebire de suprascrierea metodei, astfel de metode nu vor fi executate atunci când programul rulează. Să luăm în considerare un exemplu:class Vehicle { public static void kmToMiles(int km) { System.out.println("Inside the parent class / static method"); } } class Car extends Vehicle { public static void kmToMiles(int km) { System.out.println("Inside the child class / static method"); } } public class Demo { public static void main(String args []) { Vehicle v = new Car(); v.kmToMiles(10); } }
Ieșire din consolă:
În interiorul clasei părinte / metoda statică
Codul demonstrează clar că, în ciuda faptului că obiectul este un
Car
, metoda statică dinVehicle
clasă este apelată, deoarece metoda a fost apelată în timpul compilării. Și rețineți că nu au existat erori de compilare! -
În plus, în afară de clasele de nivel superior, puteți declara clasele statice. Astfel de clase sunt cunoscute ca
nested static classes
. Sunt utile pentru a asigura o mai bună coeziune. Un exemplu izbitor de clasă statică imbricată esteHashMap.Entry
, care este o structură de date în interiorulHashMap
. Este de remarcat faptul că, ca și clasele interne, clasele imbricate statice sunt declarate într-un fișier .class separat. Astfel, dacă declari cinci clase imbricate în clasa ta principală, vei avea 6 fișiere cu extensia .class. Un alt exemplu este declarația proprieComparator
, cum ar fi un comparator de vârstă (AgeComparator
) înEmployee
clasă. -
Modificatorul static poate fi specificat și într-un bloc static, mai bine cunoscut sub numele de „bloc de inițializare static”, care este executat atunci când clasa este încărcată. Dacă nu declarați un astfel de bloc, Java colectează toate câmpurile statice într-o singură listă și le inițializează atunci când clasa este încărcată. Un bloc static NU POATE arunca excepții bifate, dar le poate arunca pe cele nebifate. În acest caz,
ExceptionInInitializerError
va avea loc o. În practică, orice excepție care apare în timpul inițializării câmpurilor statice va fi inclusă în această eroare de către Java. Aceasta este, de asemenea, cea mai frecventă cauză aNoClassDefFoundError
, deoarece clasa nu va fi în memorie atunci când este referită. -
Este util de știut că metodele statice sunt legate în timpul compilării, spre deosebire de conectarea metodelor virtuale sau non-statice, care sunt legate în timpul execuției atunci când sunt apelate pe un obiect real. În consecință, metodele statice nu pot fi suprascrise în Java, deoarece polimorfismul nu se aplică acestora în timpul rulării. Aceasta este o limitare importantă de luat în considerare atunci când declarați o metodă statică. A face acest lucru are sens numai atunci când nu există nicio capacitate sau nevoie de a suprascrie metoda într-o subclasă. Metodele din fabrică și metodele utilitare sunt exemple bune de utilizare corectă a modificatorului static. Joshua Bloch subliniază câteva avantaje pe care metodele statice din fabrică le au față de constructori în cartea sa Effective Java, care este o lectură obligatorie pentru fiecare programator Java.
-
Inițializarea este un aspect important al unui bloc static. Câmpurile sau variabilele statice sunt inițializate după ce clasa este încărcată în memorie. Ordinea inițializării este de sus în jos, în aceeași ordine în care sunt declarate în fișierul sursă al clasei Java. Deoarece câmpurile statice sunt inițializate într-o manieră sigură pentru fire, acest proces este folosit și pentru a implementa
Singleton
modelul. Dacă nu utilizați unEnum
ca unSingleton
dintr-un motiv oarecare, atunci aveți o alternativă bună. Dar în acest caz, trebuie să țineți cont de faptul că aceasta nu este o inițializare „leneșă”. Aceasta înseamnă că câmpul static va fi inițializat chiar ÎNAINTE de a-l „cere” cineva. Dacă un obiect are resurse grele sau este folosit rar, atunci inițializarea lui într-un bloc static nu va funcționa în favoarea ta. -
În timpul serializării, câmpurile statice, precum
transient
variabilele, nu sunt serializate. Într-adevăr, dacă salvați orice date într-un câmp static, aceasta va conține valoarea inițială (implicit) după deserializare. De exemplu, dacă un câmp static este unint
, valoarea acestuia va fi zero după deserializare. Dacă tipul său estefloat
, valoarea va fi 0,0. Dacă câmpul este unObject
, valoarea va finull
. Sincer să fiu, aceasta este una dintre cele mai frecvente întrebări despre serializare în interviurile pentru posturile Java. Nu stocați datele obiectului esențial într-un câmp static! -
În sfârșit, să vorbim despre importul static. Acest modificator are multe în comun cu
import
instrucțiunea standard, dar este diferit prin faptul că vă permite să importați unul sau toți membrii clasei statice. Odată importate metodele statice, acestea pot fi accesate ca și cum ar fi fost declarate în aceeași clasă. În mod similar, importând câmpuri statice, le putem accesa fără a specifica numele clasei. Această caracteristică a apărut în Java 1.5 și îmbunătățește lizibilitatea codului atunci când este utilizată corect. Acest construct se găsește cel mai adesea în testele JUnit, deoarece aproape toți dezvoltatorii de teste folosesc importul static pentru metodele de afirmare, de exempluassertEquals()
și variantele lor supraîncărcate. -
Asta este tot pentru acum. Fiecare programator Java trebuie să cunoască toate aspectele modificatorului static menționat mai sus. Acest articol a analizat informații de bază despre variabile statice, câmpuri, metode, blocuri de inițializare și importuri. De asemenea, a atins câteva proprietăți importante care sunt esențiale pentru a scrie și înțelege programe Java. Sper că fiecare dezvoltator își va perfecționa utilizarea abil a membrilor statici, deoarece este foarte important pentru dezvoltarea de software serioasă.”
GO TO FULL VERSION