count
fältet är statiskt i klassen Counter
betyder det att du kan referera till variabeln med följande uttryck: Counter.count
. Naturligtvis måste åtkomstmodifierare övervägas. Till exempel private
är fält endast tillgängliga inom den klass där de deklareras. Och protected
fält är tillgängliga för alla klasser inom ett paket, såväl som för alla deras underklasser utanför paketet. Anta att Counter
klassen har en statisk increment()
metod vars uppgift är att ökacount
fält. För att anropa den här metoden kan du använda Counter.increment()
. Det finns inget behov av att skapa en instans av Counter
klassen för att komma åt ett statiskt fält eller en metod. Detta är den grundläggande skillnaden mellan statiska (klass) variabler och metoder och ICKE-statiska (instans) variabler och metoder. En viktig anmärkning. Glöm inte att de statiska medlemmarna i klassen direkt tillhör klassen, inte någon instans av klassen. Det vill säga, värdet på den statiska count
variabeln kommer att vara detsamma för alla Counter
objekt. I den här artikeln kommer vi att titta på de grundläggande aspekterna av att använda den statiska modifieraren i Java, samt några funktioner som hjälper dig att förstå viktiga programmeringskoncept.
Vad varje programmerare borde veta om den statiska modifieraren i Java.
I det här avsnittet tittar vi på de viktigaste aspekterna av att använda statiska metoder, fält och klasser. Låt oss börja med variablerna.-
Du KAN INTE komma åt icke-statiska medlemmar av en klass i ett statiskt sammanhang, till exempel en statisk metod eller ett block. Att kompilera koden nedan kommer att resultera i ett fel:
public class Counter { private int count; public static void main(String args []) { System.out.println(count); // Compile time error } }
Detta är ett av de vanligaste misstagen som görs av Java-programmerare, särskilt nybörjare. Eftersom
main
metoden är statisk ochcount
variabeln inte är det, kommer användningen avprintln
metoden inutimain
metoden att producera ett "kompileringstidsfel". -
Till skillnad från lokala variabler finns statiska fält och metoder INTE
thread safe
i Java. I praktiken är detta en av de vanligaste orsakerna till säkerhetsproblem i flertrådsprogrammering. Med tanke på att varje instans av en klass refererar till samma kopia av en statisk variabel, måste en sådan variabel skyddas eller "låsas" av klassen. När du använder statiska variabler, se därför till att de är korrektasynchronized
för att undvika problem somrace conditions
. -
Statiska metoder har en praktisk fördel genom att det inte finns något behov av att skapa ett nytt objekt varje gång du vill anropa dem. En statisk metod kan anropas med namnet på den klass som deklarerar den. Det är därför dessa metoder är perfekta för
factory
metoder ochutility
metoder. Klassenjava.lang.Math
är ett underbart exempel: nästan alla dess metoder är statiska. Javas verktygsklasser är markeradefinal
av samma anledning. -
En annan viktig punkt är att du inte kan åsidosätta ( )
@Override
statiska metoder. Om du deklarerar en sådan metod i ensubclass
, alltså en metod med samma namn och signatur, "gömmer" du bara metoden för metodensuperclass
istället för att åsidosätta den. Detta fenomen är känt sommethod hiding
. Detta innebär att om en statisk metod deklareras i både överordnade och underordnade klasser kommer den anropade metoden alltid att baseras på variabeltypen vid kompileringstillfället. Till skillnad från metodöverstyrning kommer sådana metoder inte att exekveras när programmet körs. Låt oss överväga ett exempel:class Vehicle { public static void kmToMiles(int km) { System.out.println("Inside the parent class / static method"); } } class Car extends Vehicle { public static void kmToMiles(int km) { System.out.println("Inside the child class / static method"); } } public class Demo { public static void main(String args []) { Vehicle v = new Car(); v.kmToMiles(10); } }
Konsolutgång:
Inuti den överordnade klassen/statiska metoden
Koden visar tydligt att trots att objektet är en , anropas
Car
den statiska metoden iVehicle
klassen, eftersom metoden anropades vid kompileringstillfället. Och observera att det inte fanns några kompileringsfel! -
Dessutom kan du, förutom klasser på toppnivå, deklarera klasser som statiska. Sådana klasser är kända som
nested static classes
. De är användbara för att ge bättre sammanhållning. Ett slående exempel på en kapslad statisk klass är ,HashMap.Entry
som är en datastruktur inutiHashMap
. Det är värt att notera att, precis som inre klasser, deklareras statiska kapslade klasser i en separat .class-fil. Således, om du deklarerar fem kapslade klasser i din huvudklass, kommer du att ha 6 filer med tillägget .class. Ett annat exempel är vår egen deklaration,Comparator
till exempel en åldersjämförare (AgeComparator
) iEmployee
klassen. -
Den statiska modifieraren kan också specificeras i ett statiskt block, bättre känt som ett "statiskt initialiseringsblock", som exekveras när klassen laddas. Om du inte deklarerar ett sådant block, samlar Java alla statiska fält i en enda lista och initierar dem när klassen laddas. Ett statiskt block KAN INTE kasta markerade undantag, men det kan kasta omarkerade. I det här fallet
ExceptionInInitializerError
uppstår ett testamente. I praktiken kommer alla undantag som inträffar under initiering av statiska fält att omslutas av detta fel av Java. Detta är också den vanligaste orsaken till ,NoClassDefFoundError
eftersom klassen inte finns i minnet när den refereras. -
Det är användbart att veta att statiska metoder är länkade vid kompilering, till skillnad från länkning av virtuella eller icke-statiska metoder, som länkas vid körning när de anropas på ett verkligt objekt. Följaktligen kan statiska metoder inte åsidosättas i Java, eftersom polymorfism inte gäller dem vid körning. Detta är en viktig begränsning att ta hänsyn till när man förklarar en metod statisk. Att göra det är bara vettigt när det inte finns någon förmåga eller behov av att åsidosätta metoden i en underklass. Fabriksmetoder och verktygsmetoder är bra exempel på korrekt användning av den statiska modifieraren. Joshua Bloch påpekar flera fördelar som statiska fabriksmetoder har jämfört med konstruktörer i sin bok Effektiv Java, som är obligatorisk läsning för alla Java-programmerare.
-
Initiering är en viktig aspekt av ett statiskt block. Statiska fält eller variabler initieras efter att klassen har laddats in i minnet. Initialiseringsordningen är från topp till botten, i samma ordning som de deklareras i Java-klassens källfil. Eftersom statiska fält initieras på ett trådsäkert sätt, används denna process också för att implementera mönstret
Singleton
. Om du inte använder enEnum
somSingleton
av någon anledning, så har du ett bra alternativ. Men i det här fallet måste du ta hänsyn till att detta inte är en "lat" initiering. Det betyder att det statiska fältet kommer att initieras även INNAN någon "frågar" efter det. Om ett objekt är resurstungt eller sällan används, kommer det inte att fungera till din fördel att initiera det i ett statiskt block. -
Under serialisering
transient
serialiseras inte statiska fält, liksom variabler. Faktum är att om du sparar data i ett statiskt fält, kommer det att innehålla dess initiala (standard) värde efter deserialisering. Till exempel, om ett statiskt fält är ettint
, kommer dess värde att vara noll efter deserialisering. Om dess typ ärfloat
, blir värdet 0,0. Om fältet är enObject
, blir värdetnull
. För att vara ärlig är detta en av de vanligaste frågorna om serialisering i intervjuer för Java-positioner. Lagra inte väsentliga objektdata i ett statiskt fält! -
Låt oss slutligen tala om statisk import. Denna modifierare har mycket gemensamt med standardsatsen,
import
men den är annorlunda genom att den låter dig importera en eller alla statiska klassmedlemmar. När statiska metoder väl har importerats kan de nås som om de deklarerades i samma klass. På samma sätt, genom att importera statiska fält, kan vi komma åt dem utan att ange klassnamnet. Den här funktionen dök upp i Java 1.5 och förbättrar kodläsbarheten när den används på rätt sätt. Denna konstruktion finns oftast i JUnit-tester, eftersom nästan alla testutvecklare använder statisk import för att hävda metoder, t.ex.assertEquals()
och deras överbelastade varianter. -
Det var allt tills vidare. Varje Java-programmerare behöver känna till alla aspekter av den statiska modifieraren som nämns ovan. Den här artikeln granskade grundläggande information om statiska variabler, fält, metoder, initieringsblock och importer. Den berörde också några viktiga egenskaper som är viktiga att känna till för att skriva och förstå Java-program. Jag hoppas att varje utvecklare kommer att fullända sin skickliga användning av statiska medlemmar, för det är väldigt viktigt för seriös mjukvaruutveckling."
GO TO FULL VERSION