CodeGym /Java blogg /Slumpmässig /10 saker du behöver veta om den statiska modifieraren i J...
John Squirrels
Nivå
San Francisco

10 saker du behöver veta om den statiska modifieraren i Java

Publicerad i gruppen
I Java betyder den statiska modifieraren att något är direkt relaterat till en klass: om ett fält är statiskt, så tillhör det klassen; om en metod är statisk, så tillhör den klassen. Som ett resultat kan du använda klassens namn för att anropa en statisk metod eller referera till ett statiskt fält. Till exempel, om countfältet är statiskt i klassen Counterbetyder det att du kan referera till variabeln med följande uttryck: Counter.count. 10 saker du behöver veta om den statiska modifieraren i Java - 1Naturligtvis måste åtkomstmodifierare övervägas. Till exempel privateär fält endast tillgängliga inom den klass där de deklareras. Och protectedfä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 Counterklassen har en statisk increment()metod vars uppgift är att ökacountfä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 Counterklassen 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 countvariabeln kommer att vara detsamma för alla Counterobjekt. 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.
  1. 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 mainmetoden är statisk och countvariabeln inte är det, kommer användningen av printlnmetoden inuti mainmetoden att producera ett "kompileringstidsfel".

  2. Till skillnad från lokala variabler finns statiska fält och metoder INTE thread safei 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 korrekta synchronizedför att undvika problem som race conditions.

  3. 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 factorymetoder och utilitymetoder. Klassen java.lang.Mathär ett underbart exempel: nästan alla dess metoder är statiska. Javas verktygsklasser är markerade finalav samma anledning.

  4. En annan viktig punkt är att du inte kan åsidosätta ( ) @Overridestatiska metoder. Om du deklarerar en sådan metod i en subclass, alltså en metod med samma namn och signatur, "gömmer" du bara metoden för metoden superclassistället för att åsidosätta den. Detta fenomen är känt som method 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 Carden statiska metoden i Vehicleklassen, eftersom metoden anropades vid kompileringstillfället. Och observera att det inte fanns några kompileringsfel!

  5. 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.Entrysom är en datastruktur inuti HashMap. 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, Comparatortill exempel en åldersjämförare ( AgeComparator) i Employeeklassen.

  6. 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 ExceptionInInitializerErroruppstå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 , NoClassDefFoundErroreftersom klassen inte finns i minnet när den refereras.

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

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

  9. Under serialisering transientserialiseras 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 ett int, kommer dess värde att vara noll efter deserialisering. Om dess typ är float, blir värdet 0,0. Om fältet är en Object, blir värdet null. 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!

  10. Låt oss slutligen tala om statisk import. Denna modifierare har mycket gemensamt med standardsatsen, importmen 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.

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

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