Java - ce înseamnă cuvântul cheie "static" în clasa oop, cod q - rus (ro)

membrii statici aparțin unei clase în locul unei instanțe specifice.

Aceasta înseamnă că există doar o singură instanță a câmpului static [1], chiar dacă creați un milion de instanțe ale clasei sau nu o creați. Acesta va fi folosit de toate instanțele.







Deoarece metodele statice nu se aplică, de asemenea, unei anumite instanțe, ele nu pot referi la membrii instanței (cum ați ști ce instanță de clasă Hello doriți să accesați?). elementele statice pot face referire doar la elementele statice. Membrii unei instanțe pot, desigur, să acceseze membri statici.

Notă: Desigur, membrii statici pot accesa membrii unei instanțe printr-o referință de obiect.

[1]: În funcție de caracteristicile timpului de execuție, acesta poate fi unul pentru ClassLoader sau AppDomain sau un flux, dar acest lucru nu se aplică punctului.

Deci, daca vreti sa faceti un nou "Hello" oriunde in codul dvs .: A- in primul script (inainte de schimbare, fara sa folositi "static"), acesta va crea un ceas nou de fiecare data cand un "Hello" în cel de-al doilea scenariu (după schimbarea folosind "static"), fiecare instanță a "noului Hello" va împărți în continuare link-ul inițial și același "ceas" care a fost creat pentru prima dată.

Dacă nu aveți nevoie de un "ceas" undeva în afara principalului, acest lucru va funcționa la fel de bine:

Un cuvânt cheie static înseamnă că ceva (un câmp, o metodă sau o clasă imbricată) este asociat cu un tip, nu cu o anumită instanță a tipului. De exemplu, unul se numește Math.sin (.) Fără nici o instanță a clasei Math. și într-adevăr nu puteți instanțiat clasa Math.

Java, din păcate, vă permite să accesați membri statici, de parcă ar fi membri ai unei instanțe, de exemplu

Acest lucru face ca aspectul de somn să fie o metodă de instanță, dar, de fapt, este o metodă statică - întotdeauna determină ca firul curent să doarmă. Cel mai bine este să faceți acest lucru în codul de apel:

Cuvântul static din Java înseamnă că o variabilă sau o funcție este distribuită între toate instanțele acestei clase după tip. dar nu de obiectele în sine.

Deci, dacă aveți o variabilă: private static int i = 0; Și îl creșteți (i ++) într-o singură instanță, această schimbare va fi reflectată în toate situațiile. Acum voi fi 1 în toate cazurile.

Metodele statice pot fi utilizate fără instanțiarea unui obiect.

Aceasta înseamnă că nu este necesar să aveți o instanță a clasei pentru a utiliza metoda. Prin urmare, în exemplul dvs., puteți apela:

Din cadrul unei metode statice (care aparține doar unei clase), nu puteți accesa membri care nu sunt statici, deoarece valorile lor depind de instanța dvs. din clasă. Astfel, ceasul care este membru al instanței va avea o valoare / referință diferită pentru fiecare instanță a clasei dvs. Hello și, prin urmare, nu puteți accesa-o din partea statică a clasei.

Această discuție a ignorat până acum considerațiile încărcătorului de clasă. Strict vorbind, câmpurile statice Java sunt partajate între toate instanțele clasei pentru acest încărcător de clasă.

Utilizarea de bază a elementelor statice.

Iată cum puteți avea valorile partajate de toți membrii clasei, fără a trimite o instanță a clasei Hello la o altă clasă. Și fără statică nu este nevoie să instanțiați o clasă.

Puteți numi pur și simplu valori sau metode statice după numele clasei:

Static este un modificator fără acces. Cuvântul cheie statică aparține unei clase decât o instanță a clasei. Poate fi folosit pentru a atașa o variabilă sau o metodă la o clasă.

Cuvântul static CAN poate fi utilizat cu:

O clasă imbrăcată într-o altă clasă

NU POATE fi utilizat cu:

Clasă (nu imbricată)

Metoda internă a clasei interne (diferența, apoi clasa imbricată)

Metode de clasă interioară

Imaginați-vă următorul exemplu, care are o variabilă de instanță numită contor care este incrementată în constructor:

Deoarece variabila instanței devine memorie la momentul creării obiectului, fiecare obiect va avea o copie a variabilei de instanță, dacă este incrementat, nu va reflecta alte obiecte.

Acum, dacă schimbăm variabila contului instanței la statică, atunci programul produce o altă ieșire:







În acest caz, variabila statică va primi memorie o singură dată, dacă orice obiect modifică valoarea variabilei statice, aceasta își va păstra valoarea.

Static cu finala:

Variabila globală, declarată finală și statică, rămâne neschimbată pentru toate execuțiile. Deoarece membrii statici sunt stocați în memoria de clasă și sunt încărcați o singură dată în întreaga execuție. Ele sunt comune tuturor obiectelor din clasă. Dacă declarați variabilele statice ca fiind finale, orice obiect nu își poate schimba valoarea, deoarece este final. Prin urmare, variabilele declarate ca fiind definitive și statice sunt uneori numite constante. Toate câmpurile de interfață sunt numite constante, deoarece, în mod implicit, acestea sunt finale și statice.

Un câmp poate fi atribuit fie unei clase, fie unei instanțe a unei clase. În mod implicit, câmpurile sunt variabile de instanță. Folosind un câmp static, devine o variabilă de clasă, deci există un singur ceas. Dacă faceți modificări într-un singur loc, acesta poate fi văzut peste tot. Variabilele variază independent una de cealaltă.

În Java, cuvântul cheie static poate fi considerat pur și simplu după cum urmează:

"Indiferent de atitudine sau de un caz particular"

Dacă vă gândiți la statică în acest fel, devine mai ușor să înțelegeți utilizarea sa în diferitele contexte în care apare:

Un câmp static este un câmp care aparține unei clase, nu unei anumite instanțe

Metodele statice nu utilizează nici o variabilă de instanță a clasei în care sunt definite. O explicație foarte bună a diferenței poate fi găsită pe această pagină

Am dezvoltat simpatie pentru metodele statice (numai dacă este posibil) în clasele "asistent".

Clasa de apel nu are nevoie să creeze o altă variabilă (instanță) a clasei de ajutor. Numiți doar metode de clasă auxiliară. De asemenea, clasa helper este îmbunătățită deoarece nu mai aveți nevoie de un constructor și nu aveți nevoie de variabilele membre (instanțe).

Probabil că există și alte avantaje.

Cuvântul cheie static este folosit pentru a desemna un câmp sau o metodă ca aparținând clasei însăși, nu unei instanțe. Folosind codul dvs., dacă obiectul Ceas este static, toate instanțele clasei Hello vor partaja elementul de date Ceas (câmp). Dacă faceți acest lucru non-static, fiecare instanță Hello separată poate avea un ceas unic.

Problema este că ați adăugat metoda principală la clasa Hello pentru a putea rula codul. Problema aici este că metoda principală este statică și, ca atare, nu se poate referi la câmpuri sau metode nestatice din interiorul acesteia. Puteți rezolva acest lucru în două moduri:

  1. Creați toate câmpurile și metodele clasei statice Hello, astfel încât acestea să poată face referire în cadrul metodei principale. Acest lucru nu este într-adevăr bun (sau motivul greșit face câmpul și / sau metoda statică)
  2. Creați o instanță a clasei Hello în cadrul metodei principale și obțineți acces la toate câmpurile și metodele sale, așa cum au fost intenționate mai întâi.

Pentru dvs., aceasta înseamnă următoarea modificare a codului dvs.:

Static face ca membrul să fie membru al clasei în locul unui membru al instanței. Fără cuvântul cheie static, va trebui să creați o instanță a clasei Hello (care are o variabilă element de sincronizare) - de exemplu

De asemenea, vă puteți gândi la membrii statici care nu au "acest" pointer. Acestea sunt distribuite între toate instanțele.

Încă o dată, rețineți că există o instanță a clasei statice pentru CLASSLOADER.

Aici Main este o metodă statică și există două limitări principale ale metodei statice:

  1. O metodă statică nu poate utiliza un element de date static sau nu poate accesa direct o metodă non-staționară.

Acest lucru și super nu pot fi folosite într-un context static.

Ieșire: eroare de compilare-timp

Pentru a adăuga la răspunsurile existente, permiteți-mi să încerc cu imaginea:

Înțelegerea conceptelor statice

Variabile statice Accesul la ele este posibil numai în metode statice, deci când declarăm variabile statice, metodele getter și setter vor fi metode statice

Metodele statice reprezintă nivelul unei clase pe care le putem accesa folosind numele clasei

Mai jos este un exemplu pentru variabilele statice: Getters și Setters:

Modificatorul static al cuvântului cheie atunci când este utilizat împreună cu o variabilă va crea o variabilă care va exista independent de orice instanțe ale obiectelor create folosind această clasă. Variabilele statice vor fi inițializate o singură dată, la începutul aplicației, uneori numite rularea aplicației. Variabilele care utilizează modificatorul static al cuvintelor cheie vor fi inițializate mai întâi, înainte de a inițializa orice variabile de instanță. Numai o copie a variabilei statice va exista în memoria sistemului, indiferent de numărul de instanțe ale clasei care conține această variabilă. Astfel, codul Java static înseamnă că variabila aparține clasei, mai degrabă decât instanțele obiectelor create de această clasă.

Modificatorul static de cuvinte cheie funcționează la fel pentru metodele declarate statice, astfel încât modificatorul static va fi folosit pentru a crea metode care trebuie să existe independent de orice instanțe ale obiectelor create folosind clasa. Aceasta stabilește din nou metoda în loc, deci aceasta este singura copie a acestei metode care va fi folosită de clasa și obiectele din această clasă.

Metodele statice nu pot folosi nici o variabilă de instanță a oricăror instanțe de obiecte create folosind clasa în care sunt definite până când unul dintre aceste instanțe de obiecte este creat. Metodele statice trebuie să ia toate valorile lor de date din lista de parametri de intrare și apoi să calculeze unul dintre acești parametri fără a se referi la variabile care sunt în mod inerent non-statice, deoarece sunt variabile!

Există două limitări principale pentru metoda statică. Acestea sunt:

1. O metodă statică nu poate utiliza un element de date static sau nu poate accesa direct o metodă non-staționară.

2.Acest lucru și super nu pot fi folosite într-un context static.

Primul motiv este cauzat de eroarea dvs. de compilare







Trimiteți-le prietenilor: