CodeGym /Java-blogg /Tilfeldig /10 ting du trenger å vite om den statiske modifikatoren i...
John Squirrels
Nivå
San Francisco

10 ting du trenger å vite om den statiske modifikatoren i Java

Publisert i gruppen
I Java betyr den statiske modifikatoren at noe er direkte relatert til en klasse: hvis et felt er statisk, så tilhører det klassen; hvis en metode er statisk, så tilhører den klassen. Som et resultat kan du bruke klassens navn til å kalle en statisk metode eller referere til et statisk felt. For eksempel, hvis countfeltet er statisk i Counterklassen, betyr det at du kan referere til variabelen med følgende uttrykk: Counter.count. 10 ting du trenger å vite om den statiske modifikatoren i Java - 1Selvfølgelig må tilgangsmodifikatorer vurderes. For eksempel privateer felt bare tilgjengelige innenfor klassen de er deklarert i. Og protectedfelt er tilgjengelige for alle klasser i en pakke, så vel som for alle deres underklasser utenfor pakken. Anta at Counterklassen har en statisk increment()metode hvis jobb er å økecountfelt. For å kalle denne metoden kan du bruke Counter.increment(). Det er ikke nødvendig å opprette en forekomst av klassen Counterfor å 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 countvariabelen vil være den samme for alle Counterobjekter. 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.
  1. 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 mainmetoden er statisk og countvariabelen ikke er det, vil bruk av printlnmetoden inne i mainmetoden produsere en "kompileringstidsfeil".

  2. I motsetning til lokale variabler, er statiske felt og metoder IKKE thread safei 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 riktig synchronizedfor å unngå problemer som race conditions.

  3. 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 factorymetoder og utilitymetoder. Klassen java.lang.Mather et fantastisk eksempel: nesten alle metodene er statiske. Javas verktøyklasser er merket finalav samme grunn.

  4. Et annet viktig poeng er at du ikke kan overstyre ( @Override) statiske metoder. Hvis du erklærer en slik metode i en subclass, altså en metode med samme navn og signatur, "skjuler" du bare metoden til superclassi stedet for å overstyre den. Dette fenomenet er kjent som method 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 i Vehicleklassen, siden metoden ble kalt på kompileringstidspunktet. Og merk at det ikke var noen kompileringsfeil!

  5. 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 er HashMap.Entry, som er en datastruktur inne i HashMap. 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æring Comparator, for eksempel en alderskomparator ( AgeComparator) i Employeeklassen.

  6. 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 ExceptionInInitializerErroroppstå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 til NoClassDefFoundError, fordi klassen ikke vil være i minnet når den refereres.

  7. 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.

  8. 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 en Enumsom Singletonav 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.

  9. Under serialisering transientblir 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 en int, vil verdien være null etter deserialisering. Hvis typen er float, vil verdien være 0,0. Hvis feltet er en Object, vil verdien være null. 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!

  10. 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.

  11. 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."

Kommentarer
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION