1. 程式人生 > >Java初始化例項

Java初始化例項

Java初始化例項


類有三個地方可以初始化例項,當類例項被初始化後,以後每一個生成的物件都會帶有初始化後的值。
三個初始化例項的地方:

  • 方法
  • 建構函式
  • 程式碼塊
    q)初始化程式碼塊和建構函式誰先執行
    a)示例
class Bike {
    int speed;
    
    Bike() {
        System.out.println("constructor is invoked");
    }

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

static{
	System.out.println("static block");                                   //最先執行,但是隨著類的載入執行,類只加載一次,所以也執行一次。
}

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

輸出結果

System.out.println("static block");
instance initializer block invoked
constructor is invoked
instance initializer block invoked
constructor is invoked

執行順序:
1. 在載入類時執行一次靜態初始化塊(之後不再呼叫)。
2. 在每次初始化例項物件時:先執行非靜態初始化塊(但是得在父類建構函式之後執行)。
3. 再執行構造方法。

對第二條再添加個示例作為解釋

package com.lch.executionOrder;

public class Parent_childClassConstructor {

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

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

class B2 extends A {
    B2() {
        //super();   任何子類會先執行父類的建構函式相當於隱藏了一條super()語句;
        System.out.println("child class constructor invoked");
    }

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

輸出結果

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

在執行程式碼塊時會先執行父類的建構函式,而執行子類建構函式的時候都會執行父類的建構函式,因為每個子類的建構函式的第一行隱藏一個super();呼叫子類的建構函式時會先執行父類的建構函式
示例2:

package com.lch.executionOrder;

public class Parent_childClassConstructor {

	@SuppressWarnings("unused")
	public static void main(String[] args) {
		B2 b = new B2();
		B2 b1 = new B2();
	}
}

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

	static {
    	System.out.println("child static is invoke!!!");
    }
}

class B2 extends A {
    B2() {
        //super();   任何子類會先執行父類的建構函式相當於隱藏了一條super()語句;
        System.out.println("child class constructor invoked");
    }
    
    B2(int i){
    	//super();   任何子類會先執行父類的建構函式相當於隱藏了一條super()語句;
    	System.out.println("child class constructor B2 invoked");
    }

    {
        System.out.println("instance initializer block is invoked");
    }
	static {
    	System.out.println("child static is invoke!!!");
    }
}

輸出結果

father static is invoke!!!
child static is invoke!!!
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

執行順序
父類靜態—> 子類靜態------>父類靜態程式碼塊---------->父類建構函式-------->子類程式碼塊--------->子類建構函式