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! |
---|
|
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 |
---|---|
|
A Java gép main egy 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 |
---|---|
|
|
|
|
|
|
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ó this
statikus 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 this
paramé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 this
paramétert használja a hívás végrehajtására. Példa
Kód | Hogyan működik |
---|---|
|
|
Ezért nem hívhat meg egy közönséges metódust statikusból. this
Egy 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?

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ó |
---|---|
|
|
|
|
|
|
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)
GO TO FULL VERSION