count
feltet er statisk i Counter
klassen, betyr det at du kan referere til variabelen med følgende uttrykk: Counter.count
. 
private
er felt bare tilgjengelige innenfor klassen de er deklarert i. Og protected
felt er tilgjengelige for alle klasser i en pakke, så vel som for alle deres underklasser utenfor pakken. Anta at Counter
klassen har en statisk increment()
metode hvis jobb er å økecount
felt. For å kalle denne metoden kan du bruke Counter.increment()
. Det er ikke nødvendig å opprette en forekomst av klassen Counter
for å få tilgang til et statisk felt eller en metode. Dette er den grunnleggende forskjellen mellom statiske (klasse) variabler og metoder og IKKE-statiske (forekomst) variabler og metoder. En viktig merknad. Ikke glem at de statiske medlemmene av klassen direkte tilhører klassen, ikke noen forekomst av klassen. Det vil si at verdien av den statiske count
variabelen vil være den samme for alle Counter
objekter. I denne artikkelen skal vi se på de grunnleggende aspektene ved bruk av den statiske modifikatoren i Java, samt noen funksjoner som vil hjelpe deg å forstå viktige programmeringskonsepter.
Hva enhver programmerer bør vite om den statiske modifikatoren i Java.
I denne delen ser vi på hovedaspektene ved bruk av statiske metoder, felt og klasser. La oss starte med variablene.-
Du KAN IKKE få tilgang til ikke-statiske medlemmer av en klasse i en statisk kontekst, for eksempel en statisk metode eller blokk. Å kompilere koden nedenfor vil resultere i en feil:
public class Counter { private int count; public static void main(String args []) { System.out.println(count); // Compile time error } }
Dette er en av de vanligste feilene som gjøres av Java-programmerere, spesielt nybegynnere. Siden
main
metoden er statisk ogcount
variabelen ikke er det, vil bruk avprintln
metoden inne imain
metoden produsere en "kompileringstidsfeil". -
I motsetning til lokale variabler, er statiske felt og metoder IKKE
thread safe
i Java. I praksis er dette en av de hyppigste årsakene til sikkerhetsproblemer i flertrådsprogrammering. Med tanke på at hver forekomst av en klasse refererer til den samme kopien av en statisk variabel, må en slik variabel beskyttes eller "låses" av klassen. Derfor, når du bruker statiske variabler, sørg for at de er riktigsynchronized
for å unngå problemer somrace conditions
. -
Statiske metoder har en praktisk fordel ved at det ikke er behov for å lage et nytt objekt hver gang du vil kalle dem. En statisk metode kan kalles ved å bruke navnet på klassen som erklærer den. Det er derfor disse metodene er perfekte for
factory
metoder ogutility
metoder. Klassenjava.lang.Math
er et fantastisk eksempel: nesten alle metodene er statiske. Javas verktøyklasser er merketfinal
av samme grunn. -
Et annet viktig poeng er at du ikke kan overstyre (
@Override
) statiske metoder. Hvis du erklærer en slik metode i ensubclass
, altså en metode med samme navn og signatur, "skjuler" du bare metoden tilsuperclass
i stedet for å overstyre den. Dette fenomenet er kjent sommethod hiding
. Dette betyr at hvis en statisk metode er deklarert i både overordnede og underordnede klasser, vil metoden som kalles alltid være basert på variabeltypen på kompileringstidspunktet. I motsetning til med metodeoverstyring, vil ikke slike metoder bli utført når programmet kjører. La oss vurdere et eksempel: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); } }
Konsoll utgang:
Inne i overordnet klasse / statisk metode
Koden viser tydelig at til tross for at objektet er en
Car
, kalles den statiske metoden iVehicle
klassen, siden metoden ble kalt på kompileringstidspunktet. Og merk at det ikke var noen kompileringsfeil! -
Dessuten, bortsett fra klasser på toppnivå, kan du erklære klasser statiske. Slike klasser er kjent som
nested static classes
. De er nyttige for å gi bedre samhold. Et slående eksempel på en nestet statisk klasse erHashMap.Entry
, som er en datastruktur inne iHashMap
. Det er verdt å merke seg at, i likhet med indre klasser, er statiske nestede klasser deklarert i en egen .class-fil. Derfor, hvis du erklærer fem nestede klasser i hovedklassen din, vil du ha 6 filer med .class-utvidelsen. Et annet eksempel er vår egen erklæringComparator
, for eksempel en alderskomparator (AgeComparator
) iEmployee
klassen. -
Den statiske modifikatoren kan også spesifiseres i en statisk blokk, bedre kjent som en "statisk initialiseringsblokk", som utføres når klassen lastes. Hvis du ikke erklærer en slik blokk, samler Java alle statiske felt i en enkelt liste og initialiserer dem når klassen lastes. En statisk blokk KAN IKKE kaste sjekkede unntak, men den kan kaste ukontrollerte unntak. I dette tilfellet
ExceptionInInitializerError
oppstår en vilje. I praksis vil ethvert unntak som oppstår under initialisering av statiske felt bli pakket inn i denne feilen av Java. Dette er også den vanligste årsaken tilNoClassDefFoundError
, fordi klassen ikke vil være i minnet når den refereres. -
Det er nyttig å vite at statiske metoder er lenket på kompileringstidspunktet, i motsetning til koblingen av virtuelle eller ikke-statiske metoder, som er koblet under kjøring når de kalles på et reelt objekt. Følgelig kan ikke statiske metoder overstyres i Java, siden polymorfisme ikke gjelder for dem under kjøring. Dette er en viktig begrensning å vurdere når man erklærer en metode statisk. Å gjøre det gir mening bare når det ikke er noen evne eller behov for å overstyre metoden i en underklasse. Fabrikkmetoder og verktøymetoder er gode eksempler på riktig bruk av den statiske modifikatoren. Joshua Bloch påpeker flere fordeler som statiske fabrikkmetoder har fremfor konstruktorer i boken Effektiv Java, som er obligatorisk lesing for enhver Java-programmerer.
-
Initialisering er et viktig aspekt ved en statisk blokk. Statiske felt eller variabler initialiseres etter at klassen er lastet inn i minnet. Rekkefølgen for initialisering er fra topp til bunn, i samme rekkefølge som de er deklarert i kildefilen til Java-klassen. Siden statiske felt initialiseres på en trådsikker måte, brukes denne prosessen også for å implementere mønsteret
Singleton
. Hvis du ikke bruker enEnum
somSingleton
av en eller annen grunn, så har du et godt alternativ. Men i dette tilfellet må du ta hensyn til at dette ikke er en "lat" initialisering. Dette betyr at det statiske feltet vil bli initialisert selv FØR noen "spør" om det. Hvis et objekt er ressurstungt eller sjelden brukt, vil initialisering av det i en statisk blokk ikke fungere i din favør. -
Under serialisering
transient
blir ikke statiske felt, som variabler, serialisert. Faktisk, hvis du lagrer data i et statisk felt, vil det inneholde dens opprinnelige (standard) verdi etter deserialisering. For eksempel, hvis et statisk felt er enint
, vil verdien være null etter deserialisering. Hvis typen erfloat
, vil verdien være 0,0. Hvis feltet er enObject
, vil verdien værenull
. For å være ærlig er dette et av de mest stilte spørsmålene om serialisering i intervjuer for Java-stillinger. Ikke lagre viktige objektdata i et statisk felt! -
Til slutt, la oss snakke om statisk import. Denne modifikatoren har mye til felles med standardsetningen
import
, men den er annerledes ved at den lar deg importere ett eller alle statiske klassemedlemmer. Når statiske metoder er importert, kan de nås som om de var deklarert i samme klasse. På samme måte, ved å importere statiske felt, kan vi få tilgang til dem uten å spesifisere klassenavnet. Denne funksjonen dukket opp i Java 1.5 og forbedrer kodelesbarheten når den brukes riktig. Denne konstruksjonen finnes oftest i JUnit-tester, siden nesten alle testutviklere bruker statisk import for assertmetoder, f.eks.assertEquals()
og deres overbelastede varianter. -
Det er alt for nå. Hver Java-programmerer trenger å kjenne alle aspektene ved den statiske modifikatoren nevnt ovenfor. Denne artikkelen gjennomgikk grunnleggende informasjon om statiske variabler, felt, metoder, initialiseringsblokker og importer. Den berørte også noen viktige egenskaper som er viktige å vite for å skrive og forstå Java-programmer. Jeg håper at hver utvikler vil perfeksjonere sin dyktige bruk av statiske medlemmer, fordi det er veldig viktig for seriøs programvareutvikling."
GO TO FULL VERSION