Sprievodca statickým kľúčovým slovom v jazyku Java

1. Úvod

V tomto článku preskúmame statický kľúčové slovo jazyka Java podrobne. Zistíme, ako môžeme použiť kľúčové slovo statický na premenné, metódy, bloky, vnorené triedy a aký je v tom rozdiel.

2. Anatómia statický Kľúčové slovo

V programovacom jazyku Java, kľúčové slovo statický označuje, že konkrétny člen patrí skôr k samotnému typu, ako k inštancii tohto typu.

To znamená, že sa vytvorí iba jedna inštancia tohto statického člena, ktorá je zdieľaná vo všetkých inštanciách triedy.

Kľúčové slovo je možné použiť na premenné, metódy, bloky a vnorenú triedu.

3. The statický Polia (alebo premenné triedy)

V Jave ak je pole deklarované statický, potom sa vytvorí presne jedna kópia tohto poľa a bude zdieľaná medzi všetky inštancie tejto triedy. Nezáleží na tom, koľkokrát inicializujeme triedu; vždy bude iba jedna kópia súboru statický k nej patriace pole. Hodnota tohto statický pole bude zdieľané so všetkými objektmi toho istého z ktorejkoľvek inej triedy.

Z pohľadu pamäti statické premenné vstupujú do konkrétneho fondu v pamäti JVM s názvom Metaspace (pred Java 8 sa tento fond nazýval Permanent Generation alebo PermGen, ktorý bol úplne odstránený a nahradený Metaspace).

3.1. Príklad statický Lúka

Predpokladajme, že máme Auto trieda s niekoľkými atribútmi (premenné inštancie). Kedykoľvek sa z toho inicializujú nové objekty Auto plán, každý nový objekt bude mať svoju odlišnú kópiu týchto premenných inštancie.

Predpokladajme však, že hľadáme premennú, ktorá bude obsahovať počet Auto objekty, ktoré sú inicializované a zdieľané vo všetkých inštanciách, takže k nim majú prístup a zvyšujú ich pri svojej inicializácii.

To je kde statický premenné prichádzajú:

public class Car {private String name; súkromný reťazcový motor; public static int numberOfCars; verejné auto (názov reťazca, motor reťazca) {this.name = meno; this.engine = motor; numberOfCars ++; } // zakladatelia a zakladatelia}

Teraz pre každý objekt tejto triedy, ktorý sa inicializuje, rovnaká kópia súboru numberOfCars premenná sa zvyšuje. V tomto prípade teda budú platiť nasledujúce tvrdenia:

@Test public void whenNumberOfCarObjectsInitialized_thenStaticCounterIncreases () {new Car ("Jaguar", "V8"); nové auto („Bugatti“, „W16“); assertEquals (2, Car.numberOfCars); }

3.2. Presvedčivé dôvody na použitie statický Polia

  • Keď je hodnota premennej nezávislá od objektov
  • Keď sa má hodnota zdieľať medzi všetkými objektmi

3.3. Kľúčové body, ktoré si treba pamätať

  • Odkedy statický premenné patria do triedy, sú prístupné priamo pomocou názvu triedy a nepotrebujú žiadny odkaz na objekt
  • statický premenné je možné deklarovať iba na úrovni triedy
  • statický polia sú prístupné bez inicializácie objektu
  • Aj keď máme prístup statický polia pomocou odkazu na objekt (napríklad ford.numberOfCars ++), nemali by sme ho používať, pretože v takom prípade je ťažké zistiť, či ide o premennú inštancie alebo premennú triedy; namiesto toho by sme sa mali vždy odvolávať na statický premenné používajúce názov triedy (napríklad v tomto prípade Car.numberOfCars ++)

4. The statický Metódy (alebo triedne metódy)

Podobný statický polia, statický metódy tiež patria do triedy namiesto do objektu, takže ich možno volať bez vytvorenia objektu triedy, v ktorej sa nachádzajú. Sú určené na použitie bez vytvárania objektov triedy.

4.1. Príklad statický Metóda

statický metódy sa všeobecne používajú na vykonanie operácie, ktorá nezávisí od vytvorenia inštancie.

Ak existuje kód, ktorý sa má zdieľať vo všetkých inštanciách tejto triedy, napíšte ho do a statický metóda:

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

statický metódy sa tiež široko používajú na vytváranie pomocných alebo pomocných tried, aby ich bolo možné získať bez vytvorenia nového objektu týchto tried.

Stačí sa pozrieť na triedy utilít Collection alebo Math z JDK, StringUtils z Apache alebo CollectionUtils z jarného prostredia a všimnúť si, že všetky metódy sú statický.

4.2. Presvedčivé dôvody na použitie statický Metódy

  • Prístup / manipulácia so statickými premennými a inými statickými metódami, ktoré nezávisia od objektov
  • statický metódy sa často používajú v triedach pomocných a pomocných látok

4.3. Kľúčové body, ktoré si treba pamätať

  • statický metódy v Jave sú vyriešené v čase kompilácie. Pretože prepísanie metódy je súčasťou runtime polymorfizmu, takže statické metódy nemožno prepísať
  • abstraktné metódy nemôžu byť statické
  • statický metódy nemôžu použiť toto alebo Super Kľúčové slová
  • Platné sú nasledujúce kombinácie inštancie, metód triedy a premenných:
    1. Metódy inštancie majú priamy prístup k metódam inštancie aj k premenným inštancie
    2. Prístup majú aj inštančné metódy statický premenné a statický metódy priamo
    3. statický metódy majú prístup ku všetkým statický premenné a iné statický metódy
    4. statický metódy nemôžu priamo pristupovať k premenným inštancie a metódam inštancie; potrebujú na to nejaký odkaz na objekt

5. A statický Blokovať

A statický blok sa používa na inicializáciu statický premenné. Hoci statický premenné je možné inicializovať priamo počas deklarácie, existujú situácie, kedy sme povinní vykonať viacriadkové spracovanie.

V takých prípadoch, statický bloky prídu vhod.

Ak statický premenné vyžadujú pri inicializácii ďalšiu logiku viacerých príkazov, potom a statický blok môže byť použitý.

5.1. The statický Blokový príklad

Predpokladajme, že chceme inicializovať objekt zoznamu s niektorými preddefinovanými hodnotami.

Toto sa stáva ľahkým statický bloky:

public class StaticBlockDemo {public static List ranks = new LinkedList (); static {ranks.add ("poručík"); ranks.add ("kapitán"); ranks.add ("Major"); } statický {ranks.add ("plukovník"); ranks.add ("Všeobecné"); }}

V tomto príklade by nebolo možné inicializovať Zoznam objekt so všetkými počiatočnými hodnotami spolu s vyhlásením; a preto sme využili statický blok tu.

5.2. Presvedčivé dôvody na použitie statický Bloky

  • Ak sa inicializuje statický premenné vyžaduje okrem priradenia aj nejakú ďalšiu logiku
  • Ak je inicializácia statických premenných náchylná na chyby a vyžaduje spracovanie výnimiek

5.3. Kľúčové body, ktoré si treba pamätať

  • Trieda môže mať viac statický blokov
  • statický polia a statický bloky sú vyriešené a vykonané v rovnakom poradí, v akom sú v triede

6. A statický Trieda

Programovací jazyk Java nám umožňuje vytvoriť triedu v rámci triedy. Poskytuje presvedčivý spôsob zoskupovania prvkov, ktoré sa budú používať iba na jednom mieste, čo pomáha udržiavať náš kód organizovanejší a čitateľnejší.

Vnorená architektúra triedy je rozdelená na dve:

  • vnorené triedy, ktoré sú deklarované statický sa volajú statický vnorené triedy keďže
  • vnorené triedy, ktoré nie sústatický sa volajú vnútorné triedy

Hlavný rozdiel medzi týmito dvoma je v tom, že vnútorné triedy majú prístup ku všetkým členom uzatvárajúcej triedy (vrátane súkromných), zatiaľ čo statický vnorené triedy majú prístup iba k statickým členom vonkajšej triedy.

V skutočnosti, statický vnorené triedy sa správali presne ako každá iná trieda najvyššej úrovne, ale boli uzavreté v jedinej triede, ktorá k nej bude mať prístup, aby poskytli lepšie pohodlie pri balení.

6.1. Príklad statický Trieda

Najbežnejšie používaný prístup k vytváraniu singletonových objektov je statický vnorená trieda nevyžaduje žiadnu synchronizáciu a je ľahké sa ju naučiť a implementovať:

public class Singleton {private Singleton () {} private static class SingletonHolder {public static final Singleton instance = new Singleton (); } verejný statický Singleton getInstance () {návrat SingletonHolder.instance; }}

6.2. Presvedčivé dôvody použitia a statický Vnútorná trieda

  • Zoskupovanie tried, ktoré sa budú používať iba na jednom mieste, zvyšuje zapuzdrenie
  • Kód sa priblíži k miestu, ktoré ho bude môcť používať iba jeden; to zvyšuje čitateľnosť a kód je udržiavateľnejší
  • Ak vnorená trieda nevyžaduje žiadny prístup k svojim členom obklopujúcim inštancie triedy, je lepšie ju deklarovať ako statický pretože týmto spôsobom nebude spojená s vonkajšou triedou, a preto bude optimálnejšia, pretože nebudú vyžadovať žiadnu haldu alebo zásobníkovú pamäť

6.3. Kľúčové body, ktoré si treba pamätať

  • statický vnorené triedy nemajú prístup k žiadnym členom inštancie obklopujúcej vonkajšej triedy; má k nim prístup iba prostredníctvom odkazu na objekt
  • statické vnorené triedy majú prístup ku všetkým statickým členom obklopujúcej triedy, vrátane súkromných
  • Špecifikácia programovania v jazyku Java nám neumožňuje deklarovať triedu najvyššej úrovne ako statický; iba triedy v rámci tried (vnorené triedy) je možné vytvoriť ako statický

7. Záver

V tomto článku sme videli statický kľúčové slovo v akcii. Dočítali sme sa tiež o dôvodoch a výhodách používania statických polí, statických metód, statických blokov a statických vnútorných tried.

Ako vždy, na GitHub nájdeme celý kód.