Een gids voor het statische sleutelwoord in Java

1. Inleiding

In dit artikel zullen we de statisch trefwoord van de Java-taal in detail. We zullen zien hoe we trefwoord kunnen toepassen statisch naar variabelen, methoden, blokken, geneste klassen en wat voor verschil het maakt.

2. De anatomie van de statisch Trefwoord

In de programmeertaal Java, het trefwoord statisch geeft aan dat het specifieke lid tot een type zelf behoort, in plaats van tot een instantie van dat type.

Dit betekent dat er slechts één instantie van dat statische lid wordt gemaakt die wordt gedeeld door alle instanties van de klasse.

Het trefwoord kan worden toegepast op variabelen, methoden, blokken en geneste klassen.

3. Het statisch Velden (of klassevariabelen)

In Java, als een veld wordt gedeclareerd statisch, dan wordt precies één kopie van dat veld gemaakt en gedeeld door alle instanties van die klasse. Het maakt niet uit hoe vaak we een klas initialiseren; er is altijd maar één exemplaar van statisch veld dat erbij hoort. De waarde hiervan statisch veld wordt gedeeld door alle objecten van een van beide van een andere klasse.

Vanuit het geheugenperspectief, statische variabelen gaan in een bepaalde pool in JVM-geheugen genaamd Metaspace (vóór Java 8 heette deze pool Permanent Generation of PermGen, die volledig was verwijderd en vervangen door Metaspace).

3.1. Voorbeeld van de statisch Veld

Stel dat we een Auto klasse met meerdere attributen (instantievariabelen). Elke keer dat hieruit nieuwe objecten worden geïnitialiseerd Auto blueprint, heeft elk nieuw object zijn eigen kopie van deze instantievariabelen.

Stel dat we op zoek zijn naar een variabele die de telling van het aantal Auto objecten die zijn geïnitialiseerd en door alle instanties worden gedeeld, zodat ze er toegang toe hebben en deze kunnen verhogen bij hun initialisatie.

Dat is waar statisch variabelen komen in:

openbare klasse Car {private String naam; privé String-engine; openbare statische int numberOfCars; openbare auto (tekenreeksnaam, tekenreeksmotor) {this.name = naam; this.engine = engine; numberOfCars ++; } // getters en setters}

Nu voor elk object van deze klasse dat wordt geïnitialiseerd, dezelfde kopie van het numberOfCars variabele wordt verhoogd. Dus in dit geval zijn de volgende beweringen waar:

@Test public void whenNumberOfCarObjectsInitialized_thenStaticCounterIncreases () {nieuwe auto ("Jaguar", "V8"); nieuwe auto ("Bugatti", "W16"); assertEquals (2, Car.numberOfCars); }

3.2. Dwingende redenen om te gebruiken statisch Velden

  • Als de waarde van variabele onafhankelijk is van objecten
  • Wanneer de waarde moet worden gedeeld door alle objecten

3.3. Belangrijke punten om te onthouden

  • Sinds statisch variabelen behoren tot een klasse, ze zijn direct toegankelijk via de klassenaam en hebben geen objectreferentie nodig
  • statisch variabelen kunnen alleen op klassenniveau worden gedeclareerd
  • statisch velden zijn toegankelijk zonder objectinitialisatie
  • Hoewel we toegang hebben statisch velden met behulp van een objectverwijzing (zoals ford.numberOfCars ++), moeten we ervan afzien het te gebruiken, omdat het in dit geval moeilijk wordt om erachter te komen of het een instantievariabele of een klassevariabele is; in plaats daarvan moeten we altijd verwijzen naar statisch variabelen die de klassenaam gebruiken (in dit geval bijvoorbeeld Car.numberOfCars ++)

4. Het statisch Methoden (of klassemethoden)

Gelijkwaardig aan statisch velden, statisch methoden behoren ook tot een klasse in plaats van het object, en dus kunnen ze worden aangeroepen zonder het object te maken van de klasse waarin ze zich bevinden. Ze zijn bedoeld om te worden gebruikt zonder objecten van de klas te maken.

4.1. Voorbeeld van statisch Methode

statisch methoden worden over het algemeen gebruikt om een ​​bewerking uit te voeren die niet afhankelijk is van het maken van een instantie.

Als er een code is die door alle instanties van die klasse moet worden gedeeld, schrijf die code dan in een statisch methode:

openbare statische ongeldige setNumberOfCars (int numberOfCars) {Car.numberOfCars = numberOfCars; }

statisch methoden worden ook veel gebruikt om utility- of helper-klassen te maken, zodat ze kunnen worden verkregen zonder een nieuw object van deze klassen te maken.

Kijk maar eens naar Collections of Math utility-klassen van JDK, StringUtils van Apache of CollectionUtils van Spring framework en merk op dat alle methoden zijn statisch.

4.2. Dwingende redenen om te gebruiken statisch Methoden

  • Voor toegang tot / manipulatie van statische variabelen en andere statische methoden die niet afhankelijk zijn van objecten
  • statisch methoden worden veel gebruikt in utility- en helper-klassen

4.3. Belangrijke punten om te onthouden

  • statisch methoden in Java worden tijdens het compileren opgelost. Aangezien het overschrijven van methoden deel uitmaakt van Runtime Polymorphism, dus statische methoden kunnen niet worden overschreven
  • abstracte methoden kunnen niet statisch zijn
  • statisch methoden kunnen niet gebruiken dit of super trefwoorden
  • De volgende combinaties van de instantie, klassemethoden en variabelen zijn geldig:
    1. Instantiemethoden hebben rechtstreeks toegang tot zowel instantiemethoden als instantievariabelen
    2. Instantiemethoden hebben ook toegang tot statisch variabelen en statisch methoden rechtstreeks
    3. statisch methoden hebben toegang tot alle statisch variabelen en andere statisch methoden
    4. statisch methodes hebben geen directe toegang tot instantievariabelen en instantiemethoden; ze hebben hiervoor een objectreferentie nodig

5. A statisch Blok

EEN statisch blok wordt gebruikt voor het initialiseren statisch variabelen. Hoewel statisch variabelen kunnen direct tijdens de declaratie worden geïnitialiseerd, er zijn situaties waarin we de verwerking op meerdere regels moeten uitvoeren.

In dergelijke gevallen, statisch blokken zijn handig.

Als statisch variabelen vereisen aanvullende logica met meerdere instructies tijdens de initialisatie, en vervolgens een statisch blok kan worden gebruikt.

5.1. De statisch Blok voorbeeld

Stel dat we een lijstobject willen initialiseren met een aantal vooraf gedefinieerde waarden.

Dit wordt gemakkelijk met statisch blokken:

openbare klasse StaticBlockDemo {openbare statische lijstrangen = nieuwe LinkedList (); static {ranks.add ("Lieutenant"); ranks.add ("Kapitein"); ranks.add ("Major"); } static {ranks.add ("Colonel"); ranks.add ("Algemeen"); }}

In dit voorbeeld is het niet mogelijk om te initialiseren Lijst object met alle beginwaarden samen met declaratie; en daarom hebben we de statisch blok hier.

5.2. Dwingende redenen om te gebruiken statisch Blokken

  • Als initialisatie van statisch variabelen vereist enige aanvullende logica behalve de toewijzing
  • Als de initialisatie van statische variabelen foutgevoelig is en afhandeling van uitzonderingen vereist

5.3. Belangrijke punten om te onthouden

  • Een klas kan meerdere hebben statisch blokken
  • statisch velden en statisch blokken worden opgelost en uitgevoerd in dezelfde volgorde als ze aanwezig zijn in de klas

6. A statisch Klasse

Met de programmeertaal Java kunnen we een klasse binnen een klasse maken. Het biedt een aantrekkelijke manier om elementen te groeperen die maar op één plek zullen worden gebruikt, dit helpt om onze code overzichtelijker en leesbaarder te houden.

De architectuur van de geneste klassen is in tweeën verdeeld:

  • geneste klassen die worden gedeclareerd statisch worden genoemd statisch geneste klassen terwijl,
  • geneste klassen die niet zijnstatisch worden genoemd innerlijke klassen

Het belangrijkste verschil tussen deze twee is dat de innerlijke klassen toegang hebben tot alle leden van de omsluitende klasse (inclusief privé), terwijl de statisch geneste klassen hebben alleen toegang tot statische leden van de buitenste klasse.

In feite, statisch geneste klassen gedroegen zich precies zoals elke andere klasse op het hoogste niveau, maar ingesloten in de enige klasse die er toegang toe heeft, om een ​​beter verpakkingsgemak te bieden.

6.1. Voorbeeld van statisch Klasse

De meest gebruikte benadering om singleton-objecten te maken is via statisch geneste klasse is dat het geen synchronisatie vereist en gemakkelijk te leren en te implementeren is:

openbare klasse Singleton {privé Singleton () {} privé statische klasse SingletonHolder {openbare statische laatste Singleton-instantie = nieuwe Singleton (); } openbare statische Singleton getInstance () {retourneer SingletonHolder.instance; }}

6.2. Dwingende redenen om een statisch Innerlijke klasse

  • Door klassen te groeperen die slechts op één plaats worden gebruikt, wordt de inkapseling vergroot
  • De code wordt dichter bij de plaats gebracht die de enige zal zijn om deze te gebruiken; dit verhoogt de leesbaarheid en de code is beter te onderhouden
  • Als de geneste klasse geen toegang vereist tot de omsluitende klasse-instantie-leden, is het beter om deze te declareren als statisch omdat het op deze manier niet wordt gekoppeld aan de buitenste klasse en dus meer optimaal zal zijn omdat ze geen heap- of stapelgeheugen nodig hebben

6.3. Belangrijke punten om te onthouden

  • statisch geneste klassen hebben geen toegang tot instantieleden van de omsluitende buitenste klasse; het kan ze alleen openen via de referentie van een object
  • statische geneste klassen hebben toegang tot alle statische leden van de omsluitende klasse, inclusief privé
  • De Java-programmeringsspecificatie staat ons niet toe om de klasse op het hoogste niveau te declareren als statisch; alleen klassen binnen de klassen (geneste klassen) kunnen worden gemaakt als statisch

7. Conclusie

In dit artikel hebben we de statisch trefwoord in actie. We lezen ook over de redenen en voordelen voor het gebruik van statische velden, statische methoden, statische blokken en statische innerlijke klassen.

Zoals altijd kunnen we de volledige code vinden op GitHub.


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