En guide till det statiska nyckelordet i Java

1. Introduktion

I den här artikeln undersöker vi det statiska nyckelordet för Java-språket i detalj. Vi hittar hur vi kan tillämpa sökord statiska variabler, metoder, block, kapslade klasser och vilken skillnad det gör.

2. Anatomin för det statiska nyckelordet

På Java-programmeringsspråket indikerar nyckelordet static att den specifika medlemmen tillhör en typ i stället för en instans av den typen .

Detta innebär att endast en instans av den statiska medlemskapen skapas som delas över alla instanser av klassen.

Nyckelordet kan tillämpas på variabler, metoder, block och kapslad klass.

3. De statiska fälten (eller klassvariabler)

I Java, om ett fält förklaras statiskt , skapas exakt en enda kopia av det fältet och delas mellan alla instanser av den klassen . Det spelar ingen roll hur många gånger vi initialiserar en klass; det kommer alltid att finnas bara en kopia av det statiska fältet som tillhör det. Värdet på det här statiska fältet kommer att delas över alla objekt av samma av någon annan klass.

Ur minnesperspektivet går statiska variabler i en viss pool i JVM-minne som heter Metaspace (före Java 8 hette denna pool Permanent Generation eller PermGen, som helt togs bort och ersattes med Metaspace).

3.1. Exempel på det statiska fältet

Anta att vi har en bilklass med flera attribut (instansvariabler) . När nya objekt initieras från denna bil blåkopia kommer varje nytt objekt har sin distinkta kopia av dessa instansvariabler.

Antag dock att vi letar efter en variabel som innehåller antalet bilobjekt som initialiseras och delas över alla instanser så att de kan komma åt den och öka den vid initialiseringen.

Det är där statiska variabler kommer in:

public class Car { private String name; private String engine; public static int numberOfCars; public Car(String name, String engine) { this.name = name; this.engine = engine; numberOfCars++; } // getters and setters }

Nu för varje objekt i den här klassen som initialiseras, ökas samma kopia av variabeln numberOfCars . Så i det här fallet kommer följande påståenden att vara sanna:

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

3.2. Tvingande skäl att använda statiska fält

  • När värdet på variabeln är oberoende av objekt
  • När värdet ska delas över alla objekt

3.3. Viktiga punkter att komma ihåg

  • Eftersom statiska variabler tillhör en klass kan de nås direkt med hjälp av klassnamn och behöver inte någon objektreferens
  • statiska variabler kan endast deklareras på klassnivå
  • statiska fält kan nås utan objektinitiering
  • Även om vi kan komma åt statiska fält med en objektreferens (som ford.numberOfCars ++ ), bör vi avstå från att använda den eftersom det i det här fallet blir svårt att räkna ut om det är en instansvariabel eller en klassvariabel; istället bör vi alltid hänvisa till statiska variabler med klassnamn (till exempel i det här fallet Car.numberOfCars ++ )

4. De statiska metoderna (eller klassmetoderna)

I likhet med statiska fält tillhör statiska metoder också en klass istället för objektet, och så kan de anropas utan att skapa objektet för den klass där de finns. De är avsedda att användas utan att skapa objekt i klassen.

4.1. Exempel på statisk metod

statiska metoder används vanligtvis för att utföra en operation som inte är beroende av skapande av instanser.

Om det finns en kod som ska delas över alla instanser av den klassen, skriv sedan koden i en statisk metod:

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

statiska metoder används också ofta för att skapa verktygs- eller hjälpklasser så att de kan erhållas utan att skapa ett nytt objekt för dessa klasser.

Ta bara en titt på samlingar eller matematikklasser från JDK, StringUtils från Apache eller CollectionUtils från Spring Framework och märker att alla metoder är statiska .

4.2. Tvingande skäl att använda statiska metoder

  • För att komma åt / manipulera statiska variabler och andra statiska metoder som inte beror på objekt
  • statiska metoder används ofta i verktygs- och hjälpklasser

4.3. Viktiga punkter att komma ihåg

  • statiska metoder i Java löses vid sammanställningstid. Eftersom metodöverstyrning är en del av Runtime Polymorphism, så kan statiska metoder inte åsidosättas
  • abstrakta metoder kan inte vara statiska
  • statiska metoder kan inte använda detta eller super sökord
  • Följande kombinationer av förekomsten, klassmetoderna och variablerna är giltiga:
    1. Instansmetoder kan direkt komma åt både instansmetoder och instansvariabler
    2. Instansmetoder kan också komma åt statiska variabler och statiska metoder direkt
    3. statiska metoder kan komma åt alla statiska variabler och andra statiska metoder
    4. statiska metoder kan inte komma åt instansvariabler och instansmetoder direkt ; de behöver någon objektreferens för att göra det

5. Ett statiskt block

Ett statiskt block används för att initiera statiska variabler. Även om statiska variabler kan initieras direkt under deklarationen, finns det situationer då vi måste utföra flerlinjebehandling.

I sådana fall kommer statiska block till nytta.

Om statiska variabler kräver ytterligare logik med flera uttalanden under initialisering kan ett statiskt block användas.

5.1. Det statiska blockexemplet

Antag att vi vill initiera ett listobjekt med några fördefinierade värden.

Detta blir enkelt med statiska block:

public class StaticBlockDemo { public static List ranks = new LinkedList(); static { ranks.add("Lieutenant"); ranks.add("Captain"); ranks.add("Major"); } static { ranks.add("Colonel"); ranks.add("General"); } }

I det här exemplet skulle det inte vara möjligt att initialisera List- objekt med alla initialvärden tillsammans med deklaration; och det är därför vi har använt det statiska blocket här.

5.2. Tvingande skäl att använda statiska block

  • Om initialisering av statiska variabler kräver ytterligare logik utom tilldelningen
  • Om initialiseringen av statiska variabler är felbenägen och kräver undantagshantering

5.3. Viktiga punkter att komma ihåg

  • En klass kan ha flera statiska block
  • statiska fält och statiska block löses och körs i samma ordning som de finns i klassen

6. En statisk klass

Med Java-programmeringsspråk kan vi skapa en klass inom en klass. Det ger ett övertygande sätt att gruppera element som bara ska användas på ett ställe, detta hjälper till att hålla vår kod mer organiserad och läsbar.

Den kapslade klassarkitekturen är uppdelad i två:

  • kapslade klasser som förklaras statiska kallas statiska kapslade klasser medan,
  • kapslade klasser som är icke- statiska kallas inre klasser

Huvudskillnaden mellan dessa två är att de inre klasserna har tillgång till alla medlemmar i den omslutande klassen (inklusive privata), medan de statiska kapslade klasserna endast har tillgång till statiska medlemmar i den yttre klassen.

I själva verket uppförde sig statiska kapslade klasser precis som alla andra toppklasser, men inneslutna i den enda klassen som kommer åt den för att ge bättre förpackningskomfort.

6.1. Exempel på statisk klass

Det mest använda sättet att skapa singleton-objekt är genom statisk kapslad klass, det kräver ingen synkronisering och är lätt att lära sig och implementera:

public class Singleton { private Singleton() {} private static class SingletonHolder { public static final Singleton instance = new Singleton(); } public static Singleton getInstance() { return SingletonHolder.instance; } }

6.2. Compelling Reasons to Use a static Inner Class

  • Grouping classes that will be used only in one place increases encapsulation
  • The code is brought closer to the place that will be only one to use it; this increases readability and code is more maintainable
  • If nested class doesn't require any access to it's enclosing class instance members, then it's better to declare it as static because this way, it won't be coupled to the outer class and hence will be more optimal as they won't require any heap or stack memory

6.3. Key Points to Remember

  • static nested classes do not have access to any instance members of the enclosing outer class; it can only access them through an object's reference
  • statiska kapslade klasser kan komma åt alla statiska medlemmar i den omslutande klassen, inklusive privata
  • Java-programmeringsspecifikation tillåter inte att vi förklarar toppklassen som statisk ; endast klasser inom klasserna (kapslade klasser) kan göras som statiska

7. Slutsats

I den här artikeln såg vi det statiska nyckelordet i aktion. Vi läser också om orsakerna och fördelarna med att använda statiska fält, statiska metoder, statiska block och statiska inre klasser.

Som alltid kan vi hitta den fullständiga koden på GitHub.