java類中成員的初始化順序(一)


類被創建之后的成員的初始化順序到底是怎么樣的?

首先 不考慮繼承

 
         
package com;

public class DemoOne {
/**
* 關於類的初始化順序
*/
//不考慮繼承結構的情況
private static int a=1;
private String str="我被賦值了";
static{
//為什么static成員函數不能訪問非static變量, 不能調用非static成員函數?
//靜態代碼塊獨立於對象而存在 不依賴於對象存在 簡單來說可以直接以類型名調用DemoOne.a
//而成員變量的存在依賴於對象的創建才能被調用
//所以, static成員不能訪問非static變量, 不能調用非static成員!
// 編譯報錯 System.out.println("str ===="+ str);
System.out.println("1 靜態變量被賦初始值 a===="+a);
System.out.println("2 進入靜態塊");
}

{
System.out.println("3 成員變量被賦值 str ===="+ str);
System.out.println("4 進到普通代碼塊");
}
public void run(){
System.out.println(" 進入普通方法");
}
public static void go(){
System.out.println(" 進入靜態方法");
}
    public DemoOne(){
System.out.println("5 進入構造器");
}

public static void main(String[] args) {
new DemoOne();
}

}
 

運行程序后輸出結果為:

1 靜態變量被賦初始值 a====1
2 進入靜態塊
3 成員變量被賦值 str ====我被賦值了
4 進到普通代碼塊
5 進入構造器

為了驗證靜態成員的順序由代碼的前后順序決定 加入第二個靜態塊

 

package com;

public class DemoOne {
    static{
        System.out.println("1 進入第一個靜態代碼塊");
    }
    private static int a;
    static{
        System.out.println("2 進入第二個靜態塊");
    }
public static void main(String[] args) {
new DemoOne();
}
}

 

輸出結果為:

1 進入第一個靜態代碼塊
2 進入第二個靜態塊

由輸出結果可以看到 調整順序后的靜態塊先后順序發生改變

總結一下 不考慮繼承的類的成員加載順序依次為 靜態變量和常量->順序位的靜態塊->普通成員變量->普通代碼塊->構造器

下面考慮存在父類的情況

 

package com;

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

public class Demo {
    /**
     *
     * @param args
     */
    private static int a=1;
    private String  str="我在父類被賦值了";
    static{
        System.out.println("1 父類靜態變量被賦初始值 a===="+a);
        System.out.println("2 進入父類靜態塊");
    }
    {
        System.out.println("5  父類成員變量被賦值  str ===="+ str);
        System.out.println("6  進入父類普通代碼塊");
    }
    public Demo(){
        System.out.println("7 進入父類構造器");
    }
}

 

子類

package com;

public class DemoOne  extends Demo{
    private static int a=1;
    private String  str="我在子類被賦值了";
    static{
        System.out.println("3 子類靜態變量被賦初始值 a===="+a);
        System.out.println("4 進入子類靜態塊");
    }
    {
        System.out.println("8  子類成員變量被賦值  str ===="+ str);
        System.out.println("9  進入子類普通代碼塊");
    }
    public DemoOne(){
        System.out.println("10 進入子類構造器");
    }
    public static void main(String[] args) {
        new  DemoOne();
    }

}

輸出結果為:

1 父類靜態變量被賦初始值 a====1
2 進入父類靜態塊
3 子類靜態變量被賦初始值 a====1
4 進入子類靜態塊
5 父類成員變量被賦值 str ====我在父類被賦值了
6 進入父類普通代碼塊
7 進入父類構造器
8 子類成員變量被賦值 str ====我在子類被賦值了
9 進入子類普通代碼塊
10 進入子類構造器

所以存在父類的情況下 類成員的初始化順序

父類靜態變量->父類靜態塊->子類靜態變量->子類靜態塊->父類成員變量->父類普通代碼塊->父類構造器->子類成員變量->子類普通代碼塊->子類構造器

還在學習總結過程中,如若有誤,請看到的朋友及時指出。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM