Java中成員變數、構造方法、程式碼塊執行順序剖析
阿新 • • 發佈:2018-12-09
今天,測試了一下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