1. Statikus módszerek

A statikus változókon kívül az osztályoknak statikus metódusai is lehetnek.

A reguláris metódusok egy osztály objektumaihoz (példányaihoz) vannak kötve, és hivatkozhatnak az osztály szokásos (nem statikus) változóira (valamint a statikus változókra és metódusokra ). A statikus metódusok az osztály statikus objektumához vannak kötve, és csak az osztály statikus változóihoz és/vagy egyéb statikus metódusaihoz férhetnek hozzá.

Ha egy közönséges (nem statikus) metódust szeretne meghívni egy osztályon, először létre kell hoznia egy objektumot az osztályból , majd meg kell hívnia a metódust az objektumon. Az osztályban nem hívhat meg egy közönséges metódust objektum helyett.

Példa:

Nem lehet nem statikus metódust meghívni egy osztályon!
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!
   }
}

De egy statikus metódus hívásához elég, ha az osztály statikus objektuma egyszerűen létezik (és az osztály memóriába való betöltése után mindig létezik). Ez az oka annak, hogy a main() metódus statikus. Az osztály statikus objektumához van kötve, így nem kell objektumokat létrehoznia a meghívásához.

A metódus statikussá nyilvánításához a static kulcsszót a metódus fejléce elé kell írni. Ennek a konstrukciónak az általános megjelenése a következő:

static Type name(parameters)
{
   method code
}

Példák:

Kód jegyzet
public class Solution
{
   public static void main(String args[])
   {
      test();
   }

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


A Java gép mainegy ilyen paranccsal hívja meg a metódust: Solution.main();



A statikus test()módszert statikus módszernek nevezik main().

Statikus metódus egy másik osztályból való hívásához meg kell adnia az osztály nevét a statikus metódus neve előtt. Ennek a konstrukciónak az általános megjelenése a következő:

Type name = ClassName.methodName(arguments)

Példák:

Kód Statikus módszer
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. Statikus vs közönséges (nem statikus) módszerek

Mi a különbség a statikus és a hagyományos módszerek között?

Egy közönséges metódus egy közönséges objektumhoz (egy osztály példányához) van kötve, míg a statikus metódus nem. Egy közönséges metódus hozzáférhet a változókhoz a példányában, de a statikus metódus nem: egyszerűen nincs társított példánya.

A kétféle módszer közötti különbségeket a következő táblázat fejezi ki:

Képesség/tulajdonság Hétköznapi módszer Statikus módszer
Az osztály egy példányához kötve Igen Nem
Meghívhatja az osztály szokásos metódusait Igen Nem
Meg tudja hívni az osztály statikus metódusait Igen Igen
Hozzáférhet az osztály szokásos változóihoz Igen Nem
Hozzáférhet az osztály statikus változóihoz Igen Igen
Tárgyra hívható Igen Igen
Az osztályon hívható Nem Igen

Miért van szükség ilyen módszerekre, ha ilyen szigorúan korlátozottak? A válasz az, hogy ennek a megközelítésnek is megvannak a maga előnyei.

Először is, nem kell objektumhivatkozást átadnia a statikus metódusok és változók eléréséhez.

Másodszor, néha csak egyetlen változónak kell lennie. Például System.out( a System osztály static out változója ).

Harmadszor, néha meg kell hívni egy metódust, mielőtt még objektumokat hozhatunk létre. Például a Java gép meghívja a main() metódust, hogy elindítsa a program végrehajtását még az osztály példányának létrehozása előtt.

Az osztály egy példányához kötve

Ha egy közönséges metódust hívunk meg, egy argumentum – az objektum, amelyen a metódus meghívásra kerül – implicit módon átadódik neki. Ezt a paramétert nevezzük this. Ez az implicit paraméter (hivatkozás arra az objektumra, amelyen a metódus meghívódik) megkülönbözteti a közönséges metódusokat a statikusaktól.

A statikus metódusok nem rendelkeznek ezzel az implicit paraméterrel, így a kulcsszó nem használható thisstatikus metódusokon belül, és nem hívható meg nem statikus metódus sem. Egyszerűen nincs sehol hivatkozás egy osztály példányára.

Meghívhatja az osztály szokásos metódusait

Egy közönséges metódusnak mindig van implicit thisparamétere, így mindig van hivatkozás arra az objektumra, amelyen a metódus meghívva van. Amikor egy közönséges metódust hív meg egy másik közönséges metóduson belül, a rendszer az implicit thisparamétert használja a hívás végrehajtására. Példa

Kód Hogyan működik
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);
}

Ezért nem hívhat meg egy közönséges metódust statikusból. thisEgy statikus metóduson belül egyszerűen nincs megnevezett implicit változó .

Vagy képzeljünk el egy másik helyzetet: az osztályunkból még egyetlen objektum sem készült el a programunkban. Meghívhatjuk-e az osztályunk statikus metódusát? Igen. És ez a statikus metódus hívhat egy közönséges (nem statikus) metódust?

Nos, milyen tárgyon neveznénk? Hiszen osztályunknak még egyetlen példánya sem létezik!

Meg tudja hívni az osztály statikus metódusait

A statikus metódusok bárhonnan meghívhatók – a program bármely helyéről. Ez azt jelenti, hogy statikus és közönséges metódusokból is hívhatók. Itt nincsenek korlátozások.

Hozzáférhet az osztály szokásos változóihoz

Egy osztály közönséges változóit egy közönséges metódusból érheti el, mivel az implicit paraméteren keresztül könnyen hivatkozást kaphat az osztály egy példányára this.

A statikus metódus nem tudja, hogy az osztály melyik példányát kell használnia a közönséges változók értékeinek lekéréséhez. És általánosabban, könnyen előfordulhat olyan helyzet, amikor egy statikus metódust meghívnak, de az osztálynak még egyetlen példánya sem jött létre a programban.

Ennek eredményeként a statikus metódusok nem férhetnek hozzá egy osztály szokásos változóihoz.

Tegyük fel, hogy egy statikus metódus egy közönséges metódust hív meg. Milyen objektumra kell hívni ezt a közönséges metódust?

Statikus módszerek

Senki se tudja! Ezért nem hívhatunk meg egy közönséges metódust statikusból anélkül, hogy ne adnánk át hivatkozást egy objektumra!

Hozzáférhet az osztály statikus változóihoz

A statikus változók hívásaival ugyanaz a helyzet, mint a statikus metódusok hívásaival. A statikus változók a program bármely pontjáról elérhetők. Ez azt jelenti, hogy statikus és közönséges módszerekkel érheti el őket.

Tárgyra hívható

Statikus és közönséges metódusok is meghívhatók egy objektumon. Egy közönséges metódushívás lehetséges – valóban, ez az egyetlen módja annak, hogy egy közönséges metódust hívjunk. Statikus metódus hívható objektumon is: ebben az esetben a fordító maga határozza meg a változó típusát, és a típusa alapján hívja meg a statikus metódust:

Kód Hogyan látja a fordító
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);

Az osztályon hívható

Egy osztályon csak statikus metódust hívhat meg. Egy közönséges metódus meghívásához hivatkozni kell az osztály egy példányára. Ezért nem hívhat meg egy közönséges metódust ezzel a konstrukcióval:ClassName.methodName(arguments)