CodeGym /Blog Java /Aleatoriu /10 lucruri pe care trebuie să le știți despre modificator...
John Squirrels
Nivel
San Francisco

10 lucruri pe care trebuie să le știți despre modificatorul static din Java

Publicat în grup
În Java, modificatorul static înseamnă că ceva este direct legat de o clasă: dacă un câmp este static, atunci aparține clasei; dacă o metodă este statică, atunci aparține clasei. Ca rezultat, puteți folosi numele clasei pentru a apela o metodă statică sau pentru a face referire la un câmp static. De exemplu, dacă countcâmpul este static în Counterclasă, înseamnă că puteți face referire la variabila cu următoarea expresie: Counter.count. 10 lucruri pe care trebuie să le știți despre modificatorul static din Java - 1Desigur, trebuie luați în considerare modificatorii de acces. De exemplu, privatecâmpurile sunt disponibile numai în cadrul clasei în care sunt declarate. Și protectedcâmpurile sunt disponibile pentru toate clasele dintr-un pachet, precum și pentru toate subclasele din afara pachetului. Să presupunem că Counterclasa are o metodă statică increment()a cărei sarcină este de a incrementacountcamp. Pentru a apela această metodă, puteți utiliza Counter.increment(). Nu este nevoie să creați o instanță a Counterclasei 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 countva fi aceeași pentru toate Counterobiectele. Î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.
  1. 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 mainmetoda este statică și countvariabila nu, utilizarea printlnmetodei în interiorul mainmetodei va produce o „eroare de timp de compilare”.

  2. 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 corect synchronizedpentru a evita probleme precum race conditions.

  3. 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 factorymetode și utilitymetode. Clasa java.lang.Matheste un exemplu minunat: aproape toate metodele sale sunt statice. Clasele de utilitate Java sunt marcate finaldin același motiv.

  4. Un alt punct important este că nu puteți suprascrie ( @Override) metodele statice. Dacă declarați o astfel de metodă într-un subclass, adică o metodă cu același nume și semnătură, pur și simplu „ascundeți” metoda superclassîn loc să o suprascrieți. Acest fenomen este cunoscut sub numele de method 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ă din Vehicleclasă este apelată, deoarece metoda a fost apelată în timpul compilării. Și rețineți că nu au existat erori de compilare!

  5. Î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ă este HashMap.Entry, care este o structură de date în interiorul HashMap. 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 proprie Comparator, cum ar fi un comparator de vârstă ( AgeComparator) în Employeeclasă.

  6. 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, ExceptionInInitializerErrorva 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ă a NoClassDefFoundError, deoarece clasa nu va fi în memorie atunci când este referită.

  7. 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.

  8. 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 Singletonmodelul. Dacă nu utilizați un Enumca un Singletondintr-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.

  9. În timpul serializării, câmpurile statice, precum transientvariabilele, 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 un int, valoarea acestuia va fi zero după deserializare. Dacă tipul său este float, valoarea va fi 0,0. Dacă câmpul este un Object, valoarea va fi null. 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!

  10. În sfârșit, să vorbim despre importul static. Acest modificator are multe în comun cu importinstrucț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 exemplu assertEquals()și variantele lor supraîncărcate.

  11. 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ă.”

Comentarii
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION