1. 程式人生 > >Java類例項化時jvm執行順序

Java類例項化時jvm執行順序

程式碼:

public class ClassLoaderTest {

    public static void main(String[] args) {
        son sons=new son();
    }
}

class parent{
    private static  int a=1;
    private static  int b;
    private   int c=initc();
    static {
        b=1;
        System.out.println("1.父類靜態程式碼塊:賦值b成功");
        System.out.println("1.父類靜態程式碼塊:a的值"+a);
    }
    int initc(){
        System.out.println("3.父類成員變數賦值:---> c的值"+c);
        this.c=12;
        System.out.println("3.父類成員變數賦值:---> c的值"+c);
        return c;
    }
    public parent(){
        System.out.println("4.父類構造方式開始執行---> a:"+a+",b:"+b);
        System.out.println("4.父類構造方式開始執行---> c:"+c);
    }
}

class son extends parent{
    private static  int sa=1;
    private static  int sb;
    private   int sc=initc2();
    static {
        sb=1;
        System.out.println("2.子類靜態程式碼塊:賦值sb成功");
        System.out.println("2.子類靜態程式碼塊:sa的值"+sa);
    }
    int initc2(){
        System.out.println("5.子類成員變數賦值--->:sc的值"+sc);
        this.sc=12;
        return sc;
    }
    public son(){
        System.out.println("6.子類構造方式開始執行---> sa:"+sa+",sb:"+sb);
        System.out.println("6.子類構造方式開始執行---> sc:"+sc);
    }
}

執行結果:

 1.父類靜態程式碼塊:賦值b成功
 1.父類靜態程式碼塊:a的值1
 2.子類靜態程式碼塊:賦值sb成功
 2.子類靜態程式碼塊:sa的值1
 3.父類成員變數賦值:---> c的值0
 3.父類成員變數賦值:---> c的值12
 4.父類構造方式開始執行---> a:1,b:1
 4.父類構造方式開始執行---> c:12
 5.子類成員變數賦值--->:sc的值0
 6.子類構造方式開始執行---> sa:1,sb:1
 6.子類構造方式開始執行---> sc:12

類載入器例項化時進行的操作步驟(載入–>連線->初始化)。
父類靜態代變數、
父類靜態程式碼塊、
子類靜態變數、
子類靜態程式碼塊、
父類非靜態變數(父類例項成員變數)、
父類建構函式、
子類非靜態變數(子類例項成員變數)、
子類建構函式。

 

 

原文地址:https://blog.csdn.net/u014042066/article/details/77574956