CodeGym /Java blog /Tilfældig /10 ting du skal vide om den statiske modifikator i Java
John Squirrels
Niveau
San Francisco

10 ting du skal vide om den statiske modifikator i Java

Udgivet i gruppen
I Java betyder den statiske modifikator, at noget er direkte relateret til en klasse: hvis et felt er statisk, så hører det til klassen; hvis en metode er statisk, så hører den til klassen. Som et resultat kan du bruge klassens navn til at kalde en statisk metode eller referere til et statisk felt. For eksempel, hvis countfeltet er statisk i Counterklassen, betyder det, at du kan referere til variablen med følgende udtryk: Counter.count. 10 ting du behøver at vide om den statiske modifikator i Java - 1Selvfølgelig skal adgangsmodifikatorer overvejes. F.eks. privateer felter kun tilgængelige inden for den klasse, hvor de er erklæret. Og protectedfelter er tilgængelige for alle klasser i en pakke, såvel som for alle deres underklasser uden for pakken. Antag, at Counterklassen har en statisk increment()metode, hvis opgave er at inkrementerecountMark. For at kalde denne metode kan du bruge Counter.increment(). Det er ikke nødvendigt at oprette en forekomst af klassen Counterfor at få adgang til et statisk felt eller en metode. Dette er den grundlæggende forskel mellem statiske (klasse) variabler og metoder og IKKE-statiske (instans) variabler og metoder. En vigtig bemærkning. Glem ikke, at de statiske medlemmer af klassen direkte tilhører klassen, ikke nogen forekomst af klassen. Det vil sige, at værdien af ​​den statiske countvariabel vil være den samme for alle Counterobjekter. I denne artikel vil vi se på de grundlæggende aspekter ved at bruge den statiske modifikator i Java, samt nogle funktioner, der vil hjælpe dig med at forstå centrale programmeringskoncepter.

Hvad enhver programmør bør vide om den statiske modifikator i Java.

I dette afsnit ser vi på hovedaspekterne ved at bruge statiske metoder, felter og klasser. Lad os starte med variablerne.
  1. Du KAN IKKE få adgang til ikke-statiske medlemmer af en klasse i en statisk kontekst, såsom en statisk metode eller blok. Kompilering af koden nedenfor vil resultere i en fejl:

    
    public class Counter {
    private int count;
    public static void main(String args []) {
       System.out.println(count); //  Compile time error
    }
    }
    

    Dette er en af ​​de mest almindelige fejl begået af Java-programmører, især nybegyndere. Da mainmetoden er statisk og countvariablen ikke er det, vil brug af printlnmetoden inde i mainmetoden producere en "kompileringstidsfejl".

  2. I modsætning til lokale variabler er statiske felter og metoder IKKE thread safei Java. I praksis er dette en af ​​de hyppigste årsager til sikkerhedsproblemer i multi-threaded programmering. I betragtning af at hver forekomst af en klasse refererer til den samme kopi af en statisk variabel, skal en sådan variabel være beskyttet eller "låst" af klassen. Når du bruger statiske variabler, skal du derfor være sikker på, at de er korrekte synchronizedfor at undgå problemer som f.eks race conditions.

  3. Statiske metoder har en praktisk fordel ved, at der ikke er behov for at oprette et nyt objekt, hver gang du vil kalde dem. En statisk metode kan kaldes ved at bruge navnet på den klasse, der erklærer den. Derfor er disse metoder perfekte til factorymetoder og utilitymetoder. Klassen java.lang.Mather et vidunderligt eksempel: næsten alle dens metoder er statiske. Javas hjælpeklasser er markeret finalaf samme grund.

  4. Et andet vigtigt punkt er, at du ikke kan tilsidesætte ( @Override) statiske metoder. Hvis du erklærer en sådan metode i en subclass, altså en metode med samme navn og signatur, "skjuler" du bare metoden til superclassi stedet for at tilsidesætte den. Dette fænomen er kendt som method hiding. Dette betyder, at hvis en statisk metode er deklareret i både overordnede og underordnede klasser, vil den kaldede metode altid være baseret på variabeltypen på kompileringstidspunktet. I modsætning til metodetilsidesættelse, vil sådanne metoder ikke blive udført, når programmet kører. Lad os overveje 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);
      }
    }
    

    Konsoludgang:

    Inde i den overordnede klasse/statiske metode

    Koden viser tydeligt, at på trods af at objektet er en , kaldes Carden statiske metode i klassen, da metoden blev kaldt på kompileringstidspunktet. VehicleOg bemærk, at der ikke var nogen kompileringsfejl!

  5. Hvad mere er, bortset fra klasser på øverste niveau, kan du erklære klasser statiske. Sådanne klasser er kendt som nested static classes. De er nyttige til at give bedre sammenhængskraft. Et slående eksempel på en indlejret statisk klasse er HashMap.Entry, som er en datastruktur indeni HashMap. Det er værd at bemærke, at ligesom indre klasser er statiske indlejrede klasser erklæret i en separat .class-fil. Således, hvis du erklærer fem indlejrede klasser i din hovedklasse, vil du have 6 filer med filtypenavnet .class. Et andet eksempel er vores egen erklæring Comparator, såsom en alderssammenligner ( AgeComparator) i Employeeklassen.

  6. Den statiske modifikator kan også specificeres i en statisk blok, bedre kendt som en "statisk initialiseringsblok", som udføres, når klassen indlæses. Hvis du ikke erklærer en sådan blok, samler Java alle statiske felter i en enkelt liste og initialiserer dem, når klassen indlæses. En statisk blok KAN IKKE smide kontrollerede undtagelser, men den kan smide ukontrollerede undtagelser. I dette tilfælde ExceptionInInitializerErroropstår et testamente. I praksis vil enhver undtagelse, der opstår under initialisering af statiske felter, blive pakket ind i denne fejl af Java. Dette er også den mest almindelige årsag til NoClassDefFoundError, fordi klassen ikke vil være i hukommelsen, når den refereres.

  7. Det er nyttigt at vide, at statiske metoder er linket på kompileringstidspunktet, i modsætning til sammenkædning af virtuelle eller ikke-statiske metoder, som er linket på kørselstidspunktet, når de kaldes på et rigtigt objekt. Følgelig kan statiske metoder ikke tilsidesættes i Java, da polymorfi ikke gælder for dem under kørsel. Dette er en vigtig begrænsning at overveje, når en metode erklæres statisk. At gøre det giver kun mening, når der ikke er nogen evne eller behov for at tilsidesætte metoden i en underklasse. Fabriksmetoder og brugsmetoder er gode eksempler på korrekt brug af den statiske modifikator. Joshua Bloch påpeger flere fordele, som statiske fabriksmetoder har i forhold til konstruktioner i sin bog Effektiv Java, som er obligatorisk læsning for enhver Java-programmør.

  8. Initialisering er et vigtigt aspekt af en statisk blok. Statiske felter eller variable initialiseres, efter at klassen er indlæst i hukommelsen. Rækkefølgen af ​​initialisering er fra top til bund, i samme rækkefølge som de er erklæret i kildefilen til Java-klassen. Da statiske felter initialiseres på en trådsikker måde, bruges denne proces også til at implementere mønsteret Singleton. Hvis du af en eller anden grund ikke bruger en Enumsom en Singleton, så har du et godt alternativ. Men i dette tilfælde skal du tage højde for, at dette ikke er en "doven" initialisering. Det betyder, at det statiske felt vil blive initialiseret, selv FØR nogen "spørger" om det. Hvis et objekt er ressourcetungt eller sjældent bruges, vil initialisering af det i en statisk blok ikke virke til din fordel.

  9. transientUnder serialisering serialiseres statiske felter, ligesom variabler, ikke. Faktisk, hvis du gemmer data i et statisk felt, vil det indeholde dens oprindelige (standard) værdi efter deserialisering. For eksempel, hvis et statisk felt er en int, vil dets værdi være nul efter deserialisering. Hvis dens type er float, vil værdien være 0,0. Hvis feltet er et Object, vil værdien være null. For at være ærlig er dette et af de hyppigst stillede spørgsmål om serialisering i interviews til Java-stillinger. Gem ikke væsentlige objektdata i et statisk felt!

  10. Lad os endelig tale om statisk import. Denne modifikator har meget til fælles med standardsætningen import, men den er anderledes ved, at den lader dig importere et eller alle statiske klassemedlemmer. Når statiske metoder er importeret, kan de tilgås, som om de var erklæret i samme klasse. På samme måde kan vi ved at importere statiske felter få adgang til dem uden at angive klassenavnet. Denne funktion dukkede op i Java 1.5 og forbedrer kodelæsbarheden, når den bruges korrekt. Denne konstruktion findes oftest i JUnit-tests, da næsten alle testudviklere bruger statisk import til assert-metoder, f.eks. assertEquals()og deres overbelastede varianter.

  11. Det er alt for nu. Enhver Java-programmør har brug for at kende alle aspekterne af den statiske modifikator nævnt ovenfor. Denne artikel gennemgik grundlæggende oplysninger om statiske variabler, felter, metoder, initialiseringsblokke og importer. Den kom også ind på nogle vigtige egenskaber, som er vigtige at kende for at skrive og forstå Java-programmer. Jeg håber, at enhver udvikler vil perfektionere deres dygtige brug af statiske medlemmer, for det er meget vigtigt for seriøs softwareudvikling."

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