Java >> Java tutorial >  >> Tag >> static

En guide til det statiske søgeord i Java

1. Oversigt

I denne øvelse vil vi udforske statikken nøgleordet for Java-sproget i detaljer.

Vi finder ud af, hvordan vi kan anvende den statiske nøgleord til variabler, metoder, blokke og indlejrede klasser, og hvilken forskel det gør.

2. det statiskes anatomi Søgeord

I Java-programmeringssproget søgeordet statisk betyder, at det pågældende medlem tilhører en type selv, snarere end til en instans af den type.

Det betyder, at vi kun opretter én forekomst af det statiske medlem, der deles på tværs af alle forekomster af klassen.

Vi kan anvende nøgleordet på variabler, metoder, blokke og indlejrede klasser.

3. Den statiske Felter (eller klassevariabler)

I Java, når vi erklærer et felt statisk , oprettes nøjagtig en enkelt kopi af det felt og deles mellem alle forekomster af den pågældende klasse.

Det er ligegyldigt, hvor mange gange vi initialiserer en klasse. Der vil altid kun være én kopi af static det tilhørende felt. Værdien af ​​denne statiske felt vil blive delt på tværs af alle objekter af enten den samme eller en hvilken som helst anden klasse.

Fra et hukommelsesperspektiv er statiske variabler gemt i heap-hukommelsen.

3.1. Eksempel på statisk Felt

Lad os sige, at vi har en bil klasse med flere attributter (instansvariabler).

Hver gang vi initialiserer nye objekter fra denne Bil blueprint, vil hvert nyt objekt have sin særskilte kopi af disse instansvariabler.

Men antag, at vi vil have en variabel, der indeholder antallet af initialiserede Car objekter og deles på tværs af alle forekomster, så de kan få adgang til det og øge det ved deres initialisering.

Det er her statisk variabler kommer ind:

public class Car {
    private String name;
    private String engine;
    
    public static int numberOfCars;
    
    public Car(String name, String engine) {
        this.name = name;
        this.engine = engine;
        numberOfCars++;
    }

    // getters and setters
}

Nu for hvert objekt af denne klasse, som vi initialiserer, den samme kopi af numberOfCars variabel øges.

Så i dette tilfælde vil disse være sande:

@Test
public void whenNumberOfCarObjectsInitialized_thenStaticCounterIncreases() {
    new Car("Jaguar", "V8");
    new Car("Bugatti", "W16");
 
    assertEquals(2, Car.numberOfCars);
}

3.2. Overbevisende grunde til at bruge statisk Felter

  • Når værdien af ​​variablen er uafhængig af objekter
  • Når værdien formodes at blive delt på tværs af alle objekter

3.3. Nøglepunkter at huske

  • Siden statisk variabler tilhører en klasse, kan vi få adgang til dem direkte ved hjælp af klassenavn. Så vi har ikke brug for nogen objektreference.
  • Vi kan kun erklære statisk variabler på klasseniveau.
  • Vi kan få adgang til statisk felter uden objektinitialisering.
  • Endelig kan vi få adgang til statisk felter ved hjælp af en objektreference (såsom ford.numberOfCars++ ). Men vi bør undgå dette, fordi det bliver svært at finde ud af, om det er en instansvariabel eller en klassevariabel. I stedet bør vi altid henvise til statisk variabler ved hjælp af klassenavn (Car.numberOfCars++ ).

4. Den statiske Metoder (eller klassemetoder)

Svarende til statisk felter, statiske metoder hører også til en klasse i stedet for objektet. Så vi kan kalde dem uden at oprette objektet for den klasse, de er i.

4.1. Eksempel på statisk Metode

Vi bruger generelt statisk metoder til at udføre en operation, der ikke er afhængig af instansoprettelse.

For at dele en kode på tværs af alle forekomster af den klasse, skriver vi denne kode i en statisk metode:

public static void setNumberOfCars(int numberOfCars) {
    Car.numberOfCars = numberOfCars;
}

Vi bruger også almindeligvis statisk metoder til at skabe hjælpe- eller hjælpeklasser, så vi kan få dem uden at oprette et nyt objekt af disse klasser.

Bare tag et kig på Collections eller Math utility klasser fra JDK, StringUtils fra Apache eller CollectionUtils fra Spring framework og bemærk, at alle metoder er statiske .

4.2. Overbevisende grunde til at bruge statisk Metoder

  • At få adgang til/manipulere statiske variabler og andre statiske metoder, der ikke afhænger af objekter
  • statisk metoder er meget brugt i hjælpe- og hjælpeklasser.

4.3. Nøglepunkter at huske

  • statisk metoder i Java løses på kompileringstidspunktet. Da metodetilsidesættelse er en del af Runtime Polymorphism,statiske metoder kan ikke tilsidesættes.
  • Abstrakte metoder kan ikke være statiske.
  • statisk metoder kan ikke bruge dette eller super søgeord.
  • Følgende kombinationer af forekomsten, klassemetoderne og variablerne er gyldige:
    1. Forekomstmetoder kan få direkte adgang til både forekomstmetoder og forekomstvariabler.
    2. Forekomstmetoder kan også få adgang til statisk variabler og statiske metoder direkte.
    3. statisk metoder kan få adgang til alle statiske variabler og andre statiske metoder.
    4. statisk metoder kan ikke få direkte adgang til instansvariabler og instansmetoder. De har brug for en objektreference for at gøre det.

5. En statisk Bloker

Vi bruger en statisk blok for at initialisere statisk variabler. Selvom vi kan initialisere statisk variabler direkte under erklæringen, er der situationer, hvor vi skal udføre multiline-behandlingen.

I sådanne tilfælde statisk blokke er nyttige.

Hvis statisk variabler kræver yderligere logik med flere sætninger under initialisering, vi kan bruge en statisk blokere.

5.1. Den statiske Blokeksempel

Antag, at vi ønsker at initialisere et listeobjekt med nogle foruddefinerede værdier.

Dette bliver nemt med statisk blokke:

public class StaticBlockDemo {
    public static List<String> ranks = new LinkedList<>();

    static {
        ranks.add("Lieutenant");
        ranks.add("Captain");
        ranks.add("Major");
    }
    
    static {
        ranks.add("Colonel");
        ranks.add("General");
    }
}

Det ville ikke være muligt at initialisere en liste objekt med alle startværdier sammen med erklæring. Det er derfor, vi har brugt den statiske bloker her.

5.2. Overbevisende grunde til at bruge statisk Blokke

  • Hvis initialiseringen af ​​statisk variabler har brug for noget ekstra logik undtagen tildelingen
  • Hvis initialiseringen af ​​statisk variabler er fejltilbøjelige og kræver håndtering af undtagelser

5.3. Nøglepunkter at huske

  • En klasse kan have flere statiske blokke.
  • statisk felter og statiske blokke løses og køres i samme rækkefølge, som de er til stede i klassen.

6. En statisk Klasse

Java programmeringssprog giver os mulighed for at oprette en klasse inden for en klasse. Det giver en overbevisende måde at gruppere elementer på, som vi kun vil bruge ét sted. Dette hjælper med at holde vores kode mere organiseret og læsbar.

Den indlejrede klassearkitektur er opdelt i to:

  • Indlejrede klasser, som vi erklærer statiske kaldes statisk indlejrede klasser.
  • Indlejrede klasser, der er ikke-statiske kaldes indre klasser.

Den største forskel mellem disse to er, at de indre klasser har adgang til alle medlemmer af den omsluttende klasse (inklusive private), mens den statiske indlejrede klasser har kun adgang til statiske medlemmer af den ydre klasse.

Faktisk statisk indlejrede klasser opfører sig nøjagtigt som enhver anden klasse på øverste niveau, men er indesluttet i den eneste klasse, der har adgang til den, for at give bedre emballagebekvemmelighed.

6.1. Eksempel på statisk Klasse

Den mest udbredte tilgang til at skabe singleton-objekter er gennem en statisk indlejret klasse:

public class Singleton  {
    private Singleton() {}

    private static class SingletonHolder {
        public static final Singleton instance = new Singleton();
    }

    public static Singleton getInstance() {
        return SingletonHolder.instance;
    }
}

Vi bruger denne metode, fordi den ikke kræver nogen synkronisering og er nem at lære og implementere.

6.2. Overbevisende grunde til at bruge en statisk Indre klasse

  • Grupper klasser, der kun vil blive brugt ét sted, øger indkapslingen.
  • Vi bringer koden tættere på det eneste sted, der vil bruge den. Dette øger læsbarheden, og koden er mere vedligeholdelsesvenlig.
  • Hvis en indlejret klasse ikke kræver adgang til dens omsluttende klasseinstansmedlemmer, er det bedre at erklære den som statisk . På denne måde bliver den ikke koblet til den ydre klasse og er derfor mere optimal, da de ikke kræver nogen hobe- eller stakhukommelse.

6.3. Nøglepunkter at huske

  • statisk indlejrede klasser har ikke adgang til nogen forekomstmedlemmer af den omsluttende ydre klasse. Den kan kun få adgang til dem gennem et objekts reference.
  • statisk indlejrede klasser kan få adgang til alle statiske medlemmer af den omsluttende klasse, inklusive private.
  • Java-programmeringsspecifikationen tillader os ikke at erklære klassen på øverste niveau som statisk . Kun klasser inden for klasserne (indlejrede klasser) kan laves som statiske .

7. Konklusion

I denne artikel så vi den statiske søgeord i aktion.

Vi læser også om årsagerne og fordelene ved at bruge statiske felter, statiske metoder, statiske blokke og statiske indre klasser.

Som altid kan vi finde den komplette kode på GitHub.


Java tag