1. Metode statice

Pe lângă variabilele statice, clasele pot avea și metode statice.

Metodele obișnuite sunt legate de obiecte (instanțe) ale unei clase și se pot referi la variabile obișnuite (non-statice) ale clasei (precum și la variabile și metode statice ). Metodele statice sunt legate de obiectul static al clasei și pot accesa doar variabilele statice și/sau alte metode statice ale clasei.

Pentru a apela o metodă obișnuită (nonstatică) pe o clasă, trebuie mai întâi să creați un obiect al clasei și apoi să apelați metoda pe obiect. Nu puteți apela o metodă obișnuită pe clasă mai degrabă decât un obiect.

Exemplu:

Nu puteți apela o metodă non-statică pe o clasă!
public class DataInfo
{
   public int getValue()
   {
      return 100;
   }
}

public class Solution
{
   public static void main(String[] args)
   {
      System.out.println(DataInfo.getValue()); // This will generate an error!
   }
}

Dar pentru a apela o metodă statică, este suficient ca obiectul static al clasei să existe pur și simplu (și există întotdeauna după ce clasa este încărcată în memorie). Acesta este motivul pentru care metoda main() este statică. Este legat de obiectul static al clasei, deci nu trebuie să creați niciun obiect pentru a-l apela.

Pentru a declara o metodă statică, trebuie să scrieți cuvântul cheie static înainte de antetul metodei. Aspectul general al acestui construct este următorul:

static Type name(parameters)
{
   method code
}

Exemple:

Cod Notă
public class Solution
{
   public static void main(String args[])
   {
      test();
   }

   public static void test()
   {
      int d = 2/0;
   }
}


Mașina Java apelează mainmetoda cu o comandă ca aceasta: Solution.main();



Metoda statică test()este numită în metoda statică main().

Pentru a apela o metodă statică dintr-o altă clasă, trebuie să specificați numele clasei înainte de numele metodei statice. Aspectul general al acestui construct este următorul:

Type name = ClassName.methodName(arguments)

Exemple:

Cod Metoda statica
int x = Math.min(a, b);
int min(int a, int b)
Thread.sleep(200);
void sleep(long ms)
Path path = Path.of("c:\\readme.txt");
Path of(String str)


2. Metode statice vs obișnuite (non-statice).

Care este diferența dintre metodele statice și cele obișnuite?

O metodă obișnuită este legată de un obiect obișnuit (o instanță a unei clase), în timp ce o metodă statică nu este. O metodă obișnuită poate accesa variabile în instanța sa, dar o metodă statică nu poate: pur și simplu nu are o instanță asociată.

Diferențele dintre cele două tipuri de metode sunt exprimate în următorul tabel:

Abilitatea/proprietatea Metoda obisnuita Metoda statica
Legat de o instanță a clasei da Nu
Poate apela metode obișnuite ale clasei da Nu
Poate apela metode statice ale clasei da da
Poate accesa variabile obișnuite ale clasei da Nu
Poate accesa variabile statice ale clasei da da
Poate fi apelat pe un obiect da da
Poate fi chemat la clasă Nu da

De ce sunt necesare astfel de metode dacă sunt atât de sever limitate? Răspunsul este că această abordare are și avantajele ei.

În primul rând, nu trebuie să treceți nicio referință la obiect pentru a accesa metode și variabile statice.

În al doilea rând, uneori trebuie să existe doar o singură instanță a unei variabile. De exemplu, System.out( variabila static out a clasei System ).

Și, în al treilea rând, uneori trebuie să apelați o metodă înainte de a fi chiar posibil să creați obiecte. De exemplu, mașina Java apelează metoda main() pentru a începe execuția programului chiar înainte ca o instanță a clasei să fie creată.

Legat de o instanță a clasei

Când este apelată o metodă obișnuită, un argument – ​​obiectul pe care este apelată metoda – îi este transmis implicit. Acest parametru se numește this. Acest parametru implicit (o referire la obiectul pe care este apelată metoda) distinge metodele obișnuite de cele statice.

Metodele statice nu au acest parametru implicit, deci nu puteți utiliza cuvântul thischeie în cadrul metodelor statice și nu puteți apela o metodă non-statică în interiorul unei metode statice. Pur și simplu nu există de unde să obțineți o referință la o instanță a unei clase.

Poate apela metode obișnuite ale clasei

O metodă obișnuită are întotdeauna parametrul implicit this, deci aveți întotdeauna o referință la obiectul pe care este apelată metoda. Ori de câte ori apelați o metodă obișnuită în interiorul unei alte metode obișnuite, thisparametrul implicit este folosit pentru a efectua acel apel. Exemplu

Cod Cum functioneaza
int min(int a, int b)
{
   return a < b ? a : b;
}

int min(int a, int b, int c)
{
   int t = min(a, b);
   return min(t, c);
}
int min(int a, int b)
{
   return a < b ? a : b;
}

int min(int a, int b, int c)
{
   int t = this.min(a, b);
   return this.min(t, c);
}

De aceea nu poți apela o metodă obișnuită dintr-una statică. Pur și simplu nu există o variabilă implicită numită thisîn interiorul unei metode statice.

Sau imaginați-vă o altă situație: niciun obiect din clasa noastră nu a fost încă creat în programul nostru. Putem numi o metodă statică a clasei noastre? Da. Și poate această metodă statică să apeleze o metodă obișnuită (non-statică)?

Ei bine, pe ce obiect l-am chema? La urma urmei, nici o instanță a clasei noastre nu există încă!

Poate apela metode statice ale clasei

Metodele statice pot fi apelate de oriunde — din orice loc din program. Aceasta înseamnă că pot fi apelate atât din metode statice, cât și din cele obișnuite. Nu există restricții aici.

Poate accesa variabile obișnuite ale clasei

Puteți accesa variabile obișnuite ale unei clase dintr-o metodă obișnuită, deoarece poate obține cu ușurință o referință la o instanță a clasei prin intermediul parametrului implicit this.

O metodă statică nu știe ce instanță a clasei ar trebui să folosească pentru a obține valori ale variabilelor obișnuite. Și mai general, putem avea cu ușurință o situație în care este apelată o metodă statică, dar nici o instanță a clasei nu a fost încă creată în program.

Ca urmare, metodele statice nu pot accesa variabilele obișnuite ale unei clase.

Să presupunem că o metodă statică apelează o metodă obișnuită. La ce obiect ar trebui apelată acea metodă obișnuită?

Metode statice

Nimeni nu stie! De aceea nu poți apela o metodă obișnuită dintr-una statică fără a trece o referință la un obiect!

Poate accesa variabile statice ale clasei

Situația cu apelurile la variabile statice este aceeași ca și cu apelurile la metode statice. Variabilele statice pot fi accesate de oriunde în program. Asta înseamnă că le poți accesa din metode statice și obișnuite.

Poate fi apelat pe un obiect

Atât metodele statice, cât și cele obișnuite pot fi apelate pe un obiect. Este posibil un apel de metodă obișnuit - într-adevăr, acesta este singurul mod de a apela o metodă obișnuită. O metodă statică poate fi apelată și pe un obiect: în acest caz, compilatorul însuși determină tipul variabilei și apelează metoda statică în funcție de tipul acesteia:

Cod Cum îl vede compilatorul
Thread th = Thread.current();
th.sleep(1000);
Thread th = Thread.current();
Thread.sleep(1000);
Integer i = 1;
int x = i.parseInt("12");
Integer i = 1;
int x = Integer.parseInt("12");
"".valueOf(12);
String.valueOf(12);

Poate fi chemat la clasă

Puteți apela doar o metodă statică pe o clasă. Pentru a apela o metodă obișnuită, aveți nevoie de o referință la o instanță a clasei. Prin urmare, nu puteți apela o metodă obișnuită folosind acest construct:ClassName.methodName(arguments)