En guide til det statiske nøgleord i Java

1. Introduktion

I denne artikel undersøger vi statisk nøgleord for Java-sproget i detaljer. Vi finder ud af, hvordan vi kan anvende søgeord statisk til variabler, metoder, blokke, indlejrede klasser og hvilken forskel det gør.

2. Anatomi af statisk Nøgleord

På programmeringssproget Java, nøgleordet statisk angiver, at det bestemte medlem hører til selve typen snarere end til en forekomst af den type.

Dette betyder, at der kun oprettes en forekomst af det statiske medlem, der deles på tværs af alle forekomster af klassen.

Nøgleordet kan anvendes på variabler, metoder, blokke og indlejret klasse.

3. Den statisk Felter (eller klassevariabler)

I Java, hvis et felt er erklæret statisk, derefter oprettes nøjagtigt en enkelt kopi af dette felt og deles mellem alle forekomster af den klasse. Det betyder ikke noget, hvor mange gange vi initialiserer en klasse; der vil altid kun være en kopi af statisk felt, der hører til det. Værdien af ​​dette statisk felt deles på tværs af alle objekter af det samme af en hvilken som helst anden klasse.

Fra hukommelsesperspektivet statiske variabler går i en bestemt pool i JVM-hukommelse kaldet Metaspace (før Java 8 blev denne pool kaldet Permanent Generation eller PermGen, som blev fjernet fuldstændigt og erstattet med Metaspace).

3.1. Eksempel på statisk Mark

Antag, at vi har en Bil klasse med flere attributter (instansvariabler). Hver gang nye objekter initialiseres fra dette Bil blueprint, vil hvert nyt objekt have sin distinkte kopi af disse instansvariabler.

Antag dog, at vi leder efter en variabel, der holder antallet af Bil objekter, der initialiseres og deles på tværs af alle forekomster, så de kan få adgang til det og øge det efter deres initialisering.

Det er her statisk variabler kommer ind:

offentlig klasse bil {privat strengnavn; privat streng motor; offentligt statisk int-nummerOfCars; public Car (String name, String engine) {this.name = name; this.motor = motor; numberOfCars ++; } // getters og setters}

Nu for hvert objekt i denne klasse, der bliver initialiseret, den samme kopi af numberOfCars variabel er inkrementeret. Så i denne sag vil følgende påstande være sandt:

@Test offentlig ugyldig nårNumberOfCarObjectsInitialized_thenStaticCounterIncreases () {ny bil ("Jaguar", "V8"); ny bil ("Bugatti", "W16"); assertEquals (2, Car.numberOfCars); }

3.2. Tvingende grunde til at bruge statisk Felter

  • Når værdien af ​​variablen er uafhængig af objekter
  • Når værdien skal deles på tværs af alle objekter

3.3. Nøglepunkter at huske

  • Siden statisk variabler hører til en klasse, de kan tilgås direkte ved hjælp af klasse navn og har ikke brug for nogen objektreference
  • statisk variabler kan kun deklareres på klasseniveau
  • statisk felter kan tilgås uden objektinitialisering
  • Selvom vi kan få adgang statisk felter ved hjælp af en objektreference (som f.eks ford.numberOfCars ++), bør vi afstå fra at bruge det, da det i dette tilfælde bliver svært at finde ud af, om det er en instansvariabel eller en klassevariabel; i stedet skal vi altid henvise til statisk variabler ved hjælp af klasse navn (for eksempel i dette tilfælde Car.numberOfCars ++)

4. Den statisk Metoder (eller klassemetoder)

Svarende til statisk felter, statisk metoder hører også til en klasse i stedet for objektet, og så kan de kaldes uden at skabe objektet for den klasse, hvor de bor. De er beregnet til at blive brugt uden at skabe objekter fra klassen.

4.1. Eksempel på statisk Metode

statisk metoder bruges generelt til at udføre en operation, der ikke er afhængig af oprettelse af instans.

Hvis der er en kode, der formodes at blive delt på tværs af alle forekomster af den klasse, så skriv koden i en statisk metode:

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

statisk metoder bruges også i vid udstrækning til at oprette hjælpeprogrammer eller hjælperklasser, så de kan opnås uden at skabe et nyt objekt i disse klasser.

Bare kig på samlinger eller matematikværktøjsklasser fra JDK, StringUtils fra Apache eller CollectionUtils fra Spring framework og bemærk at alle metoder er statisk.

4.2. Tvingende grunde til at bruge statisk Metoder

  • For at få adgang til / manipulere statiske variabler og andre statiske metoder, der ikke afhænger af objekter
  • statisk metoder anvendes i vid udstrækning i utility- og hjælperklasser

4.3. Nøglepunkter at huske

  • statisk metoder i Java løses på kompileringstidspunktet. Da metodeoverstyring er en del af Runtime Polymorphism, så statiske metoder kan ikke tilsidesættes
  • abstrakte metoder kan ikke være statiske
  • statisk metoder kan ikke bruge det her eller super nøgleord
  • Følgende kombinationer af forekomsten, klassemetoder og variabler er gyldige:
    1. Instansmetoder kan få direkte adgang til både instansmetoder og instansvariabler
    2. Instansmetoder kan også få adgang statisk variabler og statisk metoder direkte
    3. statisk metoder kan få adgang til alle statisk variabler og andet statisk metoder
    4. statisk metoder kan ikke få direkte adgang til instansvariabler og instansmetoder; de har brug for noget objekthenvisning for at gøre det

5. A statisk Blok

EN statisk blok bruges til initialisering statisk variabler. Selvom statisk variabler kan initialiseres direkte under erklæring, der er situationer, hvor vi skal udføre multiline-behandlingen.

I sådanne tilfælde, statisk blokke er nyttige.

Hvis statisk variabler kræver yderligere logik med flere udsagn under initialisering, derefter a statisk blok kan bruges.

5.1. Det statisk Blokeksempel

Antag, at vi vil initialisere et listeobjekt med nogle foruddefinerede værdier.

Dette bliver let med statisk blokke:

offentlig klasse StaticBlockDemo {offentlig statisk liste rangerer = ny LinkedList (); statisk {ranks.add ("Løjtnant"); ranks.add ("kaptajn"); ranks.add ("Major"); } statisk {ranks.add ("oberst"); ranks.add ("Generelt"); }}

I dette eksempel ville det ikke være muligt at initialisere Liste objekt med alle de oprindelige værdier sammen med erklæring; og det er derfor, vi har brugt statisk blokere her.

5.2. Tvingende grunde til at bruge statisk Blokke

  • Hvis initialisering af statisk variabler kræver yderligere logik undtagen tildelingen
  • Hvis initialiseringen af ​​statiske variabler er udsat for fejl og kræver undtagelseshåndtering

5.3. Nøglepunkter at huske

  • En klasse kan have flere statisk blokke
  • statisk felter og statisk blokke løses og udføres i samme rækkefølge, som de er til stede i klassen

6. A statisk Klasse

Java-programmeringssprog giver os mulighed for at oprette en klasse inden for en klasse. Det giver en overbevisende måde at gruppere elementer, der kun skal bruges ét sted, dette hjælper med at holde vores kode mere organiseret og læsbar.

Den indlejrede klassearkitektur er opdelt i to:

  • indlejrede klasser, der er erklæret statisk hedder statisk nestede klasser der henviser til,
  • nestede klasser, der ikke erstatisk hedder indre klasser

Hovedforskellen mellem disse to er, at de indre klasser har adgang til alle medlemmer af den indesluttende klasse (inklusive privat), mens statisk nestede klasser har kun adgang til statiske medlemmer af den ydre klasse.

Faktisk, statisk nestede klasser opførte sig nøjagtigt som enhver anden topklasse, men indesluttet i den eneste klasse, der får adgang til den, for at give bedre emballagekomfort.

6.1. Eksempel på statisk Klasse

Den mest anvendte tilgang til at oprette singleton-objekter er igennem statisk nestet klasse er, at det ikke kræver nogen synkronisering og er let at lære og implementere:

offentlig klasse Singleton {privat Singleton () {} privat statisk klasse SingletonHolder {offentlig statisk endelig Singleton-forekomst = ny Singleton (); } offentlig statisk Singleton getInstance () {return SingletonHolder.instance; }}

6.2. Tvingende grunde til at bruge a statisk Indre klasse

  • Gruppering af klasser, der kun bruges ét sted, øger indkapslingen
  • Koden bringes tættere på det sted, der kun vil være en til at bruge den; dette øger læsbarheden, og koden er mere vedligeholdelig
  • Hvis nestet klasse ikke kræver nogen adgang til det, der omslutter klasseinstansmedlemmer, er det bedre at erklære det som statisk fordi denne måde vil det ikke være koblet til den ydre klasse og vil derfor være mere optimal, da de ikke kræver nogen heap eller stack hukommelse

6.3. Nøglepunkter at huske

  • statisk nestede klasser har ikke adgang til nogen instansmedlemmer i den omgivende ydre klasse; det kan kun få adgang til dem gennem et objekts reference
  • statiske indlejrede klasser kan få adgang til alle statiske medlemmer af den indesluttende klasse, inklusive private
  • Java-programmeringsspecifikation tillader os ikke at erklære topklassen som statisk; kun klasser inden for klasser (nestede klasser) kan laves som statisk

7. Konklusion

I denne artikel så vi statisk nøgleord i aktion. Vi læser også om årsagerne og fordelene ved at bruge statiske felter, statiske metoder, statiske blokke og statiske indre klasser.

Som altid kan vi finde den komplette kode på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found