鍍金池/ 教程/ Java/ Java實(shí)例初始化程序塊
Java for循環(huán)
Java接口
Java是什么?
Java命名約定
java中方法重載和方法重寫(xiě)的區(qū)別
Java運(yùn)算符
Java抽象類(lèi)
Java快速入門(mén)
Java實(shí)例初始化程序塊
Java靜態(tài)綁定和動(dòng)態(tài)綁定
Java do-while循環(huán)
Java對(duì)象克隆
Java Object類(lèi)
Java聚合
Java繼承
Java this關(guān)鍵字
Java虛擬機(jī)內(nèi)部體系結(jié)構(gòu)
Java構(gòu)造器(構(gòu)造方法)
Eclipse安裝和配置
Java多態(tài)
Java方法重載
Java while循環(huán)
Java教程
Java按值調(diào)用和引用調(diào)用
Java strictfp關(guān)鍵字
Java封裝
Java語(yǔ)言特點(diǎn)
Java數(shù)組
Java instanceof運(yùn)算符
Java包裝類(lèi)
Java命令行參數(shù)
Java包
Java面向?qū)ο螅∣OP)概念
簡(jiǎn)單Java程序
Java基礎(chǔ)實(shí)例程序
Java對(duì)象和類(lèi)
Java continue語(yǔ)句
Java抽象類(lèi)和接口的區(qū)別
C++ VS Java比較
Java if/else語(yǔ)句
Java switch語(yǔ)句
Java歷史
Java變量和數(shù)據(jù)類(lèi)型
安裝Java環(huán)境(Linux)
Java JDK安裝和配置
Hello Java程序的內(nèi)部細(xì)節(jié)
Java break語(yǔ)句
Java方法重寫(xiě)
Java Unicode編碼系統(tǒng)
怎么樣開(kāi)始學(xué)習(xí)Java編程?
對(duì)象和類(lèi)之間的區(qū)別
Java訪(fǎng)問(wèn)修飾符
Java super關(guān)鍵字
Java注釋
JDK,JRE和JVM之間的區(qū)別
Java final關(guān)鍵字
Java static關(guān)鍵字

Java實(shí)例初始化程序塊

實(shí)例初始化程序塊用于初始化實(shí)例數(shù)據(jù)成員。 它在每次創(chuàng)建類(lèi)的對(duì)象時(shí)運(yùn)行。實(shí)例變量的初始化可以是直接的,但是可以在初始化實(shí)例初始化塊中的實(shí)例變量時(shí)執(zhí)行額外的操作。

什么是實(shí)例初始化塊的使用,我們可以直接分配一個(gè)值在實(shí)例數(shù)據(jù)成員? 例如:

class Bike{  
    int speed=100;  
}

為什么要使用實(shí)例初始化塊?

假設(shè)在賦值給實(shí)例數(shù)據(jù)成員時(shí)必須要執(zhí)行一些操作。 如:使用for循環(huán)來(lái)填充復(fù)雜數(shù)組或錯(cuò)誤處理等。

實(shí)例初始化程序塊的示例

下面來(lái)看看實(shí)例初始化塊執(zhí)行初始化的簡(jiǎn)單例子。

class Bike7 {
    int speed;

    Bike7() {
        System.out.println("speed is " + speed);
    }

    {
        speed = 100;
    }

    public static void main(String args[]) {
        Bike7 b1 = new Bike7();
        Bike7 b2 = new Bike7();
    }
}

執(zhí)行上面代碼得到以下結(jié)果 -

speed is 100
speed is 100

在Java中有三個(gè)地方可以執(zhí)行實(shí)例初始化塊操作:

  1. 方法
  2. 構(gòu)造函數(shù)
  3. 代碼塊

實(shí)例初始化塊或構(gòu)造函數(shù)哪個(gè)先調(diào)用?

看看下面代碼就知道了。

class Bike8 {
    int speed;

    Bike8() {
        System.out.println("constructor is invoked");
    }

    {
        System.out.println("instance initializer block invoked");
    }

    public static void main(String args[]) {
        Bike8 b1 = new Bike8();
        Bike8 b2 = new Bike8();
    }
}

執(zhí)行上面代碼得到以下結(jié)果 -

instance initializer block invoked
constructor is invoked
instance initializer block invoked
constructor is invoked

在上面的例子中,似乎首先調(diào)用實(shí)例初始化塊,但是可惜不是。 實(shí)例初始化塊在對(duì)象創(chuàng)建時(shí)被調(diào)用。 java編譯器在第一個(gè)語(yǔ)句super()之后的構(gòu)造函數(shù)中復(fù)制實(shí)例初始化塊。 首先,調(diào)用構(gòu)造函數(shù)。 讓我們通過(guò)下面的圖來(lái)理解它:

注意:java編譯器在每個(gè)構(gòu)造函數(shù)中會(huì)自動(dòng)復(fù)制實(shí)例初始化塊的代碼。

實(shí)例初始化塊的規(guī)則:

實(shí)例初始化塊主要有三個(gè)規(guī)則。 它們?nèi)缦拢?/p>

  1. 在創(chuàng)建類(lèi)的實(shí)例時(shí)創(chuàng)建實(shí)例初始化程序塊。
  2. 在父類(lèi)構(gòu)造函數(shù)被調(diào)用之后(即在super()構(gòu)造函數(shù)調(diào)用之后)調(diào)用實(shí)例初始化塊。
  3. 實(shí)例初始化程序塊按它們顯示的順序排列。

super()之后調(diào)用的實(shí)例初始化塊的程序示例:

class A {
    A() {
        System.out.println("parent class constructor invoked");
    }
}

class B2 extends A {
    B2() {
        super();
        System.out.println("child class constructor invoked");
    }

    {
        System.out.println("instance initializer block is invoked");
    }

    public static void main(String args[]) {
        B2 b = new B2();
    }
}

上面代碼執(zhí)行結(jié)果如下 -

parent class constructor invoked
instance initializer block is invoked
child class constructor invoked

實(shí)例塊的另一個(gè)示例

class A {
    A() {
        System.out.println("parent class constructor invoked");
    }
}

class B3 extends A {
    B3() {
        super();
        System.out.println("child class constructor invoked");
    }

    B3(int a) {
        super();
        System.out.println("child class constructor invoked " + a);
    }

    {
        System.out.println("instance initializer block is invoked");
    }

    public static void main(String args[]) {
        B3 b1 = new B3();
        B3 b2 = new B3(10);
    }
}

上面代碼執(zhí)行結(jié)果如下 -

parent class constructor invoked
instance initializer block is invoked
child class constructor invoked
parent class constructor invoked
instance initializer block is invoked
child class constructor invoked 10