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

Statisk vs. Instance Initializer Block i Java

1. Oversigt

I denne tutorial lærer vi begrebet statisk blok og instansinitialiseringsblok. Vi vil også kontrollere forskellene og udførelsesrækkefølgen for klassekonstruktørerne og initialiseringsblokkene.

2. Statisk blok

I Java udfører en statisk blok kode før objektinitialiseringen . En statisk blok er en kodeblok med en statisk søgeord:

static {
    // definition of the static block
}

Statisk initialiseringsblok eller statisk initialiseringsblok eller statisk klausul er nogle andre navne for den statiske blok. Statisk blokkode udføres kun én gang under klassens indlæsning . De statiske blokke udføres altid først før main() metode i Java, fordi compileren gemmer dem i hukommelsen på tidspunktet for klassens indlæsning og før objektets oprettelse.

En klasse kan have flere statiske blokke, og de vil køre i samme rækkefølge, som de vises i klassen:

public class StaticBlockExample {

    static {
        System.out.println("static block 1");
    }
    
    static {
        System.out.println("static block 2");
    }

    public static void main(String[] args) {
        System.out.println("Main Method");
    }
}

Outputtet for ovenstående kodestykke er:

static block 1
static block 2
Main Method

Her udfører compileren alle de statiske blokke først, og efter at have afsluttet den statiske blokudførelse, kalder den main() metode. Java-kompileren sørger for, at udførelsen af ​​statiske initialiseringsblokke vil være i samme rækkefølge, som de vises i kildekoden.

Statiske blokke af overordnet klasse udføres først, fordi compileren indlæser overordnet klasse før underordnet klasse.

Som et kuriosum, før Java 1.7, var main()-metoden ikke obligatorisk i alle Java-applikationer, så al koden kunne skrives i statiske blokke. Men fra Java 1.7 og fremefter er main() metoden obligatorisk.

3. Instance Initializer Block

Som navnet antyder, er formålet med instansinitialiseringsblokken at initialisere instansdatamedlemmerne.

Forekomstens initialiseringsblok ligner den statiske initialiseringsblok, men uden den statiske søgeord:

{
     // definition of the Instance initialization block
}

Statiske initialiseringsblokke udføres altid før instansinitialiseringsblokkene, fordi statiske blokke kører på tidspunktet for klassens indlæsning. Forekomstblokken kører dog på tidspunktet for oprettelse af forekomsten. Java-kompileren kopierer initialiseringsblokke ind i hver konstruktør. Derfor kan flere konstruktører bruge denne tilgang til at dele en kodeblok:

public class InstanceBlockExample {

    {
        System.out.println("Instance initializer block 1");
    }
    
    {
        System.out.println("Instance initializer block 2");
    }
    
    public InstanceBlockExample() {
        System.out.println("Class constructor");
    }

    public static void main(String[] args) {
        InstanceBlockExample iib = new InstanceBlockExample();
        System.out.println("Main Method");
    }
}

Så i dette tilfælde ville outputtet for ovenstående kode være:

Instance initializer block 1
Instance initializer block 2
Class constructor
Main Method

Forekomstinitialiseringsblokkene udføres under hver konstruktørkald, da compileren kopierer initialiseringsblokken i selve konstruktøren.

Compileren udfører den overordnede klasses instansblok, før den afvikler den aktuelle klasses instansblok. Compileren kalder den overordnede klassekonstruktør af super(), og instansblokke udføres på tidspunktet for konstruktørpåkaldelse.

4. Forskelle mellem Static og Instance Initializer Block

Statisk blok Instance Initializer Block
Det udføres under indlæsning af klassen Det udføres under instansiering af klassen
Den kan kun bruge statiske variabler Den kan bruge statiske eller ikke-statiske (instansvariabler).
Det kan ikke bruge dette Den kan bruge dette
Det udføres kun én gang under hele programmets udførelse, når klassen indlæses i hukommelsen Det kan køre mange gange, når der er et kald til konstruktøren

5. Konklusion

I denne tutorial har vi lært, at compileren udfører statiske blokke under indlæsning af klasse. Statiske blokke kan bruges til at initialisere statiske variable eller til at kalde en statisk metode. En instansblok udføres dog hver gang en instans af klassen oprettes, og den kan bruges til at initialisere instansdatamedlemmerne.

Derudover kan de komplette kodeeksempler til denne artikel findes på GitHub.


Java tag