Útmutató a Java statikus kulcsszavához

1. Bemutatkozás

Ebben a cikkben a statikus a Java nyelv kulcsszavát részletesen. Megtaláljuk, hogyan alkalmazhatjuk a kulcsszót statikus változókhoz, módszerekhez, blokkokhoz, beágyazott osztályokhoz és milyen különbségeket jelent.

2. Anatómiája a statikus Kulcsszó

A Java programozási nyelven a kulcsszó statikus azt jelzi, hogy az adott tag egy típushoz tartozik, nem pedig egy ilyen típusú példányhoz.

Ez azt jelenti, hogy ennek a statikus tagnak csak egy példánya jön létre, amely meg van osztva az osztály összes példányán.

A kulcsszó alkalmazható változókra, módszerekre, blokkokra és beágyazott osztályokra.

3. Az statikus Mezők (vagy osztályváltozók)

Java-ban ha egy mezőt deklarálunk statikus, akkor ennek a mezőnek pontosan egy példánya jön létre, és megosztásra kerül az osztály összes példánya között. Nem számít, hányszor inicializálunk egy osztályt; mindig csak egy példánya lesz statikus hozzá tartozó mező. Ennek értéke statikus mező meg lesz osztva bármelyik objektum bármelyikével, bármely más osztály bármelyikével.

A memória szempontjából a statikus változók a JVM memóriájának egy speciális, Metaspace nevű készletébe kerülnek (a Java 8 előtt ezt a készletet Permanent Generation vagy PermGen néven hívták, amelyet teljesen eltávolítottak és Metaspace-re cseréltek).

3.1. Példa a statikus Terület

Tegyük fel, hogy van egy Autó osztály több attribútummal (példányváltozók). Amikor új objektumokat inicializálnak ebből Autó terv, minden új objektumnak külön példánya lesz ezekről a példányváltozókról.

Tegyük fel azonban, hogy olyan változót keresünk, amely megtartja a számok számát Autó az inicializált és az összes példányon megosztott objektumok, hogy azok inicializálásukkor hozzáférhessenek hozzá és növeljék azokat.

Ahol statikus változók érkeznek:

public class Car {private String name; saját String motor; public static int numberOfCars; public Car (karakterlánc neve, karakterlánc-motor) {this.name = név; ez.motor = motor; numberOfCars ++; } // szerelők és beállítók}

Most ennek az osztálynak minden objektumáról, amelyet inicializálunk, a numberOfCars változó növekszik. Tehát ebben az esetben a következő állítások lesznek igazak:

@Test public void whenNumberOfCarObjectsInitialized_thenStaticCounterIncreases () {new Car ("Jaguar", "V8"); új autó ("Bugatti", "W16"); assertEquals (2, Car.numberOfCars); }

3.2. Kényszerítő okok a használatra statikus Mezők

  • Amikor a változó értéke objektumoktól független
  • Amikor az értéket állítólag minden objektumon meg kell osztani

3.3. Kulcsfontosságú megjegyzendő pontok

  • Mivel statikus A változók egy osztályhoz tartoznak, közvetlenül elérhetõk az osztálynév segítségével, és nincs szükségük objektum hivatkozásra
  • statikus változókat csak osztály szinten lehet deklarálni
  • statikus a mezők objektum inicializálás nélkül érhetők el
  • Bár hozzáférhetünk statikus mezők objektumhivatkozással (például ford.numberOfCars ++), tartózkodnunk kell a használatától, mivel ebben az esetben nehéz megérteni, hogy példányváltozó vagy osztályváltozó-e; ehelyett mindig utalnunk kell statikus osztály nevét használó változók (például ebben az esetben Car.numberOfCars ++)

4. A statikus Módszerek (vagy osztály módszerek)

Hasonló statikus mezők, statikus A metódusok az objektum helyett egy osztályba is tartoznak, és így meghívhatók anélkül, hogy létrehoznák annak az osztálynak az objektumát, amelyben tartózkodnak. Az osztály objektumainak létrehozása nélkül használhatók.

4.1. Például statikus Módszer

statikus A módszereket általában olyan művelet végrehajtására használják, amely nem függ a példány létrehozásától.

Ha van olyan kód, amelyet állítólag meg kell osztani az osztály összes példányán, akkor írja be a kódot a-ba statikus módszer:

public static void setNumberOfCars (int numberOfCars) {Car.numberOfCars = numberOfCars; }

statikus A módszereket széles körben használják segédprogramok vagy segítő osztályok létrehozására is, hogy ezek az osztályok új objektumának létrehozása nélkül is megszerezhetők legyenek.

Vessen egy pillantást a JDK Gyűjtemények vagy matematikai segédosztályaira, az Apache-ból származó StringUtils vagy a SpringUplication keretrendszerre, és vegye észre, hogy az összes statikus.

4.2. Kényszerítő okok a használatra statikus Mód

  • Statikus változók és egyéb statikus módszerek elérése / kezelése, amelyek nem függenek az objektumoktól
  • statikus módszereket széles körben használják a segéd- és segítő osztályokban

4.3. Kulcsfontosságú megjegyzendő pontok

  • statikus A Java módszerek fordításkor oldódnak meg. Mivel a módszer felülírása a futásidejű polimorfizmus része, tehát a statikus módszereket nem lehet felülírni
  • az elvont módszerek nem lehetnek statikusak
  • statikus módszerek nem használhatók ez vagy szuper kulcsszavak
  • A példány, osztály metódusok és változók következő kombinációi érvényesek:
    1. A példány metódusok közvetlenül hozzáférhetnek mind a példány metódusaihoz, mind a példány változókhoz
    2. Példány metódusok is hozzáférhetnek statikus változók és statikus módszereket közvetlenül
    3. statikus módszerek hozzáférhetnek az összeshez statikus változók és egyéb statikus mód
    4. statikus A metódusok nem férhetnek hozzá közvetlenül a példányváltozókhoz és a példánymódszerekhez; szükségük van valamilyen objektum hivatkozásra

5. A statikus Blokk

A statikus blokkot használjuk az inicializáláshoz statikus változók. Habár statikus változók közvetlenül inicializálhatók a deklarálás során, vannak olyan esetek, amikor a többsoros feldolgozást kell elvégeznünk.

Ilyen esetekben, statikus tömbök jól jönnek.

Ha statikus a változók az inicializálás során további, több állítású logikát igényelnek, majd a statikus blokk használható.

5.1. A statikus Blokk példa

Tegyük fel, hogy egy listaobjektumot inicializálni szeretnénk néhány előre definiált értékkel.

Ez könnyűvé válik statikus blokkok:

public class StaticBlockDemo {public static List ranks = new LinkedList (); statikus {rangok.add ("hadnagy"); rangok.add ("kapitány"); rangok.add ("őrnagy"); } statikus {ranks.add ("ezredes"); rangok.add ("Általános"); }}

Ebben a példában nem lehetne inicializálni Lista objektum az összes kezdeti értékkel a deklarációval együtt; és ezért hasznosítottuk a statikus blokkolja itt.

5.2. Kényszerítő okok a használatra statikus Blokkok

  • Ha az inicializálása statikus A változók a logika kivételével további logikát igényelnek
  • Ha a statikus változók inicializálása hibára hajlamos és kivételkezelést igényel

5.3. Kulcsfontosságú megjegyzendő pontok

  • Egy osztálynak több is lehet statikus blokkok
  • statikus mezők és statikus a blokkokat ugyanabban a sorrendben oldják fel és hajtják végre, mint az osztályban vannak

6. A statikus Osztály

A Java programozási nyelv lehetővé teszi számunkra, hogy osztályt hozzunk létre egy osztályon belül. Meggyőző módot kínál a csak egy helyen használható elemek csoportosítására, ez segít a kódunk szervezettebbé és olvashatóbbá tételében.

A beágyazott osztály architektúrája két részre oszlik:

  • beillesztett beágyazott osztályok statikus hívják statikus beágyazott osztályok mivel,
  • be nem ágyazott osztályokstatikus hívják belső osztályok

A fő különbség e kettő között az, hogy a belső osztályok hozzáférhetnek a befogadó osztály minden tagjához (beleértve a magánosztályt is), míg a statikus a beágyazott osztályok csak a külső osztály statikus tagjaihoz férhetnek hozzá.

Valójában, statikus a beágyazott osztályok pontosan úgy viselkedtek, mint bármely más felső szintű osztály, de a jobb csomagolási kényelem érdekében az egyetlen osztályba tartoznak, amely hozzáférni fog hozzá.

6.1. Például statikus Osztály

A legszélesebb körben alkalmazott módszer az egyes objektumok létrehozására a statikus a beágyazott osztály nem igényel szinkronizálást, és könnyen megtanulható és megvalósítható:

nyilvános osztály Singleton {private Singleton () {} privát statikus osztály SingletonHolder {public static final Singleton instance = new Singleton (); } public static Singleton getInstance () {return SingletonHolder.instance; }}

6.2. Kényszerítő okok a statikus Belső osztály

  • A csak egy helyen használt osztályok csoportosítása növeli a kapszulázást
  • A kód közelebb kerül ahhoz a helyhez, ahol csak az fogja használni; ez növeli az olvashatóságot és a kód jobban karbantartható
  • Ha a beágyazott osztály nem igényel hozzáférést az osztálypéldány tagjaihoz, akkor jobb, ha ezt deklaráljuk statikus mert így nem lesz összekapcsolva a külső osztállyal, és így optimálisabb lesz, mivel nem igényelnek halom vagy verem memóriát

6.3. Kulcsfontosságú megjegyzendő pontok

  • statikus a beágyazott osztályok nem férhetnek hozzá a csatoló külső osztály egyetlen példányához; csak egy objektum hivatkozásán keresztül férhet hozzájuk
  • a statikus beágyazott osztályok hozzáférhetnek a csatoló osztály összes statikus tagjához, beleértve a privátokat is
  • A Java programozási specifikáció nem teszi lehetővé, hogy a legfelső szintű osztályt deklaráljuk statikus; csak az osztályokon belüli osztályok (beágyazott osztályok) készíthetők statikus

7. Következtetés

Ebben a cikkben láttuk a statikus kulcsszó működésben. Olvassunk a statikus mezők, a statikus módszerek, a statikus blokkok és a statikus belső osztályok használatának okairól és előnyeiről is.

Mint mindig, a teljes kódot megtalálhatjuk a GitHubon.