En guide til det statiske nøkkelordet i Java

1. Introduksjon

I denne artikkelen vil vi utforske statisk nøkkelordet til Java-språket i detalj. Vi finner hvordan vi kan bruke søkeord statisk til variabler, metoder, blokker, nestede klasser og hvilken forskjell det utgjør.

2. Anatomi av statisk Nøkkelord

I programmeringsspråket Java, nøkkelordet statisk indikerer at det bestemte medlemmet tilhører en type selv, snarere enn en forekomst av den typen.

Dette betyr at bare en forekomst av det statiske medlemmet blir opprettet som deles på tvers av alle forekomster av klassen.

Nøkkelordet kan brukes på variabler, metoder, blokker og nestet klasse.

3. Den statisk Felt (eller klassevariabler)

I Java, hvis et felt er erklært statisk, så opprettes og deles nøyaktig en enkelt kopi av dette feltet mellom alle forekomster av den klassen. Det spiller ingen rolle hvor mange ganger vi initialiserer en klasse; det vil alltid være bare ett eksemplar av statisk felt som tilhører den. Verdien av dette statisk feltet vil bli delt på tvers av alle objekter av det samme av en annen klasse.

Fra minneperspektivet, statiske variabler går i et bestemt basseng i JVM-minne kalt Metaspace (før Java 8 ble dette bassenget kalt Permanent Generation eller PermGen, som ble fullstendig fjernet og erstattet med Metaspace).

3.1. Eksempel på statisk Felt

Anta at vi har en Bil klasse med flere attributter (instansvariabler). Hver gang nye objekter initialiseres fra dette Bil tegning, vil hvert nye objekt ha sin distinkte kopi av disse forekomstvariablene.

Anta imidlertid at vi leter etter en variabel som holder antallet av Bil objekter som er initialisert og deles på tvers av alle tilfeller slik at de kan få tilgang til den og øke den ved initialiseringen.

Det er hvor statisk variabler kommer inn:

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

Nå for hvert objekt i denne klassen som blir initialisert, den samme kopien av numberOfCars variabel er inkrementert. Så for denne saken vil følgende påstander være sanne:

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

3.2. Tvingende grunner til å bruke statisk Enger

  • Når verdien av variabelen er uavhengig av objekter
  • Når verdien skal deles på tvers av alle objekter

3.3. Viktige punkter å huske

  • Siden statisk variabler tilhører en klasse, de er tilgjengelige direkte ved bruk av klassenavn og trenger ingen objektreferanse
  • statisk variabler kan kun deklareres på klassenivå
  • statisk felt er tilgjengelige uten objektinitialisering
  • Selv om vi har tilgang statisk felt ved hjelp av en objektreferanse (som ford.numberOfCars ++), bør vi avstå fra å bruke det, da det i dette tilfellet blir vanskelig å finne ut om det er en instansvariabel eller en klassevariabel; i stedet bør vi alltid referere til statisk variabler som bruker klassenavn (for eksempel i dette tilfellet, Car.numberOfCars ++)

4. Den statisk Metoder (eller klassemetoder)

Lik statisk Enger, statisk metoder tilhører også en klasse i stedet for objektet, og slik at de kan kalles uten å skape objektet til klassen de bor i. De er ment å brukes uten å lage objekter fra klassen.

4.1. Eksempel av statisk Metode

statisk metoder brukes vanligvis til å utføre en operasjon som ikke er avhengig av oppretting av forekomst.

Hvis det er en kode som skal deles på tvers av alle forekomster av den klassen, så skriv koden i en statisk metode:

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

statisk metoder er også mye brukt for å lage verktøy eller hjelperklasser, slik at de kan oppnås uten å lage et nytt objekt i disse klassene.

Bare ta en titt på samlinger eller matematikkverktøysklasser fra JDK, StringUtils fra Apache eller CollectionUtils fra Spring framework og legg merke til at alle metodene er statisk.

4.2. Tvingende grunner til å bruke statisk Metoder

  • Å få tilgang til / manipulere statiske variabler og andre statiske metoder som ikke er avhengige av objekter
  • statisk metoder er mye brukt i nytte- og hjelperklasser

4.3. Viktige punkter å huske

  • statisk metoder i Java løses på kompileringstidspunktet. Siden metodeoverstyring er en del av Runtime Polymorphism, så statiske metoder kan ikke overstyres
  • abstrakte metoder kan ikke være statiske
  • statisk metoder kan ikke bruke dette eller super søkeord
  • Følgende kombinasjoner av forekomsten, klassemetoder og variabler er gyldige:
    1. Forekomstsmetoder kan få direkte tilgang til både forekomstsmetoder og forekomstvariabler
    2. Forekomstmetoder kan også få tilgang statisk variabler og statisk metoder direkte
    3. statisk metoder har tilgang til alle statisk variabler og annet statisk metoder
    4. statisk metoder kan ikke få tilgang til forekomstvariabler og forekomstmetoder direkte; de trenger noe referanse for å gjøre det

5. A statisk Blokkere

EN statisk blokk brukes til initialisering statisk variabler. Selv om statisk variabler kan initialiseres direkte under erklæring, det er situasjoner når vi er pålagt å utføre flerlinjebehandling.

I slike tilfeller, statisk blokker er nyttige.

Hvis statisk variabler krever ytterligere logikk med flere utsagn under initialisering, deretter a statisk kan brukes.

5.1. De statisk Blokkeksempel

Anta at vi vil initialisere et listeobjekt med noen forhåndsdefinerte verdier.

Dette blir enkelt med statisk blokker:

offentlig klasse StaticBlockDemo {offentlig statisk liste rangerer = ny LinkedList (); statisk {ranks.add ("løytnant"); ranks.add ("Captain"); ranks.add ("Major"); } statisk {ranks.add ("Oberst"); ranks.add ("Generelt"); }}

I dette eksemplet ville det ikke være mulig å initialisere Liste objekt med alle de opprinnelige verdiene sammen med erklæringen; og det er derfor vi har brukt statisk blokker her.

5.2. Tvingende grunner til å bruke statisk Blokker

  • Hvis initialisering av statisk variabler krever litt ekstra logikk bortsett fra oppgaven
  • Hvis initialiseringen av statiske variabler er utsatt for feil og krever unntakshåndtering

5.3. Viktige punkter å huske

  • En klasse kan ha flere statisk blokker
  • statisk felt og statisk blokker løses og utføres i samme rekkefølge som de er tilstede i klassen

6. A statisk Klasse

Java-programmeringsspråk lar oss lage en klasse i en klasse. Det gir en overbevisende måte å gruppere elementer som bare skal brukes på ett sted, dette bidrar til å holde koden vår mer organisert og lesbar.

Den nestede klassearkitekturen er delt i to:

  • nestede klasser som er erklært statisk er kalt statisk nestede klasser mens,
  • nestede klasser som ikke erstatisk er kalt indre klasser

Hovedforskjellen mellom disse to er at de indre klassene har tilgang til alle medlemmene i den omsluttende klassen (inkludert private), mens statisk nestede klasser har bare tilgang til statiske medlemmer av den ytre klassen.

Faktisk, statisk nestede klasser oppførte seg nøyaktig som alle andre toppnivåklasser, men innelukket i den eneste klassen som får tilgang til den, for å gi bedre innpakningskomfort.

6.1. Eksempel av statisk Klasse

Den mest brukte tilnærmingen for å lage singleton-objekter er gjennom statisk nestet klasse er det ikke krever noen synkronisering og er lett å 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 grunner til å bruke a statisk Indre klasse

  • Gruppering av klasser som bare skal brukes på ett sted øker innkapslingen
  • Koden bringes nærmere stedet som bare vil være å bruke den; dette øker lesbarheten og koden er mer vedlikeholdbar
  • Hvis nestet klasse ikke krever tilgang til den som omslutter klasseinstansmedlemmer, er det bedre å erklære det som statisk fordi på denne måten vil den ikke bli koblet til den ytre klassen, og vil derfor være mer optimal, ettersom de ikke trenger noe heap- eller stackminne

6.3. Viktige punkter å huske

  • statisk nestede klasser har ikke tilgang til noen instansmedlemmer i den omsluttende ytre klassen; den har bare tilgang til dem gjennom et objekts referanse
  • statiske nestede klasser har tilgang til alle statiske medlemmer av klassen, inkludert private
  • Java-programmeringsspesifikasjon tillater ikke oss å erklære toppnivåklassen som statisk; bare klasser innenfor klassene (nestede klasser) kan gjøres som statisk

7. Konklusjon

I denne artikkelen så vi statisk nøkkelord i aksjon. Vi leser også om årsakene og fordelene ved bruk av statiske felt, statiske metoder, statiske blokker og statiske indre klasser.

Som alltid kan vi finne den fullstendige koden på GitHub.