1. 程式人生 > >Java中成員變數、構造方法、程式碼塊執行順序剖析

Java中成員變數、構造方法、程式碼塊執行順序剖析

今天,測試了一下java中成員變數、構造方法、程式碼塊等的執行順序,程式碼如下:

package com.carol.entity;

/**
 * @author Carol Tang
 * @version 1.0.0
 * @date 2018-09-13 10:37
 * @description
 **/
class G_Member{
    G_Member(){
        System.out.println("[初始化G_Member例項成員變數]");
    }
}

class G_StaticMember{
    G_StaticMember(){
        System.out.println("[初始化G_StaticMember靜態成員變數]");
    }
}


class F_Member{
    F_Member(){
        System.out.println("[初始化F_Member例項成員變數]");
    }
}
class F_StaticMember{
    F_StaticMember(){
        System.out.println("[初始化F_StaticMember靜態成員變數]");
    }
}

class Grantfather {
    //靜態成員變數g_staticMember
    static G_StaticMember g_staticMember = new G_StaticMember();
    //例項成員變數g_member
    G_Member g_member = new G_Member();
    //靜態成員變數name
    public static String name = "grantfather";
    //例項成員變數age
    public int age = 18;

    static {
        System.out.println("Grantfather類,static靜態程式碼塊");
    }

    {
        System.out.println("Grantfather類,構造程式碼塊");
    }
    Grantfather() {

        System.out.println("Grantfather類,無參構造方法,name = "+ name);
    }

    Grantfather(String name){
        this.name = name; //如果沒有將傳入的引數賦值給本類的name,則預設輸出是傳入的引數值,而非本類靜態name值
        System.out.println("Grantfather類,有參構造方法,name = "+name);
    }

    Grantfather(int age){
        System.out.println("Grantfather類,有參構造方法,age = "+age);//預設輸出是傳入的引數值,而非本類age
    }
}
class Father extends Grantfather{
    public String name = "father";
    //靜態成員變數 f_staticMember
    static F_StaticMember f_staticMember = new F_StaticMember();
    //例項成員變數f_member
    F_Member f_member = new F_Member();

    static {
        System.out.println("Father類,static靜態程式碼塊");
    }

    {
        System.out.println("Father類,構造程式碼塊");
    }
    Father(){
//        super();
//        super.name = "txx";
        super("txx");
        //super(20);
        System.out.println("Father類,無參構造方法,name = "+name);
    }
    Father(int age){
        super();
        super.age = age;//此處將修改Grantfather類的age,則Father類的age也改變
        System.out.println("Father類,有參構造方法,name = "+name);
        System.out.println("Father類,有參構造方法,age = "+age);
    }
}
class Son extends Father{
    Son(){
        super();
        System.out.println("Son類,無參構造方法");
        System.out.println("Son類,name = "+name);
        System.out.println("Son類,age = "+age);
    }
}

public class Test{
    public static void main(String[] args){
        System.out.println("=======================第 1 次開始執行==================================");
        Grantfather grantfather = new Grantfather();

        System.out.println("=======================第 2 次開始執行==================================");
        Grantfather grantfather2 = new Grantfather();

        System.out.println("=======================第 3 次開始執行==================================");
        Grantfather grantfather3 = new Grantfather("carol");

        System.out.println("=======================第 4 次開始執行==================================");
        Grantfather grantfather4 = new Grantfather(20);
        System.out.println("Grantfather類,age = "+grantfather4.age);
        System.out.println("Grantfather類,name = "+grantfather4.name);

        System.out.println("=======================第 5 次開始執行==================================");
        Father father = new Father();

        System.out.println("=======================第 6 次開始執行==================================");
        Father father2 = new Father(99);
        System.out.println("Father類,age = "+father2.age);

        System.out.println("=======================第 7 次開始執行==================================");
        Son son = new Son();

        System.out.println("========================第 8 次開始執行=================================");
        Grantfather grantfather5 = new Grantfather();
        System.out.println("Grantfather類,name = "+grantfather5.name);
    }
}

輸出結果如下:

=======================第 1 次開始執行==================================
[初始化G_StaticMember靜態成員變數]
Grantfather類,static靜態程式碼塊
[初始化G_Member例項成員變數]
Grantfather類,構造程式碼塊
Grantfather類,無參構造方法,name = grantfather
=======================第 2 次開始執行==================================
[初始化G_Member例項成員變數]
Grantfather類,構造程式碼塊
Grantfather類,無參構造方法,name = grantfather
=======================第 3 次開始執行==================================
[初始化G_Member例項成員變數]
Grantfather類,構造程式碼塊
Grantfather類,有參構造方法,name = carol
=======================第 4 次開始執行==================================
[初始化G_Member例項成員變數]
Grantfather類,構造程式碼塊
Grantfather類,有參構造方法,age = 20
Grantfather類,age = 18
Grantfather類,name = carol
=======================第 5 次開始執行==================================
[初始化F_StaticMember靜態成員變數]
Father類,static靜態程式碼塊
[初始化G_Member例項成員變數]
Grantfather類,構造程式碼塊
Grantfather類,有參構造方法,name = txx
[初始化F_Member例項成員變數]
Father類,構造程式碼塊
Father類,無參構造方法,name = father
=======================第 6 次開始執行==================================
[初始化G_Member例項成員變數]
Grantfather類,構造程式碼塊
Grantfather類,無參構造方法,name = txx
[初始化F_Member例項成員變數]
Father類,構造程式碼塊
Father類,有參構造方法,name = father
Father類,有參構造方法,age = 99
Father類,age = 99
=======================第 7 次開始執行==================================
[初始化G_Member例項成員變數]
Grantfather類,構造程式碼塊
Grantfather類,有參構造方法,name = txx
[初始化F_Member例項成員變數]
Father類,構造程式碼塊
Father類,無參構造方法,name = father
Son類,無參構造方法
Son類,name = father
Son類,age = 18
Son類,name = father
Son類,age = 18
========================第 8 次開始執行=================================
[初始化G_Member例項成員變數]
Grantfather類,構造程式碼塊
Grantfather類,無參構造方法,name = txx
Grantfather類,name = txx