浅谈java类中成员的初始化顺序(一)

类被创建之后的成员的初始化顺序到底是怎么样的?

首先 不考虑继承

package com;

public class DemoOne {
    /**
     * 关于类的初始化顺序
     */
    //不考虑继承结构的情况
    private static int a;
    private String  str="我被赋值了";
    {
        System.out.println("3 进入代码块中  str ===="+ str);
        System.out.println("4 进到普通代码块");


    }
    static{
        System.out.println("1 静态代码块 a==="+a);
        //此时a 已经有了初始值0 说明 静态变量在静态代码块之前执行 原因是代码的前后顺序
        //  编译报错     System.out.println("str ===="+ str);
        System.out.println("2 进入静态代码块");


    }
    public DemoOne(){
        System.out.println("5 进入构造器");
        System.out.println(" 构造器中 str===="+str);
        System.out.println("a===="+a);

    }

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

}

运行程序后输出结果为:

1 静态代码块 a===0
2 进入静态代码块
3 代码块中 str ====我被赋值了
4 进到普通代码块
5 进入构造器
构造器中 str====我被赋值了
a====0

为了验证静态成员的顺序由代码的前后顺序决定 讲静态变量和静态块顺序调整

package com;

public class DemoOne {
    /**
     * 关于类的初始化顺序
     */
    //不考虑继承结构的情况
    static{
        //  编译报错     System.out.println("str ===="+ str);
        System.out.println("1 进入第一个静态代码块");
    }
    private static int a;
    static{
        System.out.println("2 进入第二个静态块 a===="+a);
    }
    private String  str="我被赋值了";
    {
        System.out.println("3 进入代码块中  str ===="+ str);
        System.out.println("4 进到普通代码块");


    }

    public DemoOne(){
        System.out.println("5 进入构造器");
        System.out.println(" 构造器中 str===="+str);
        System.out.println("a===="+a);

    }

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

}

输出结果为:

1 进入第一个静态代码块
2 进入第二个静态块 a====0
3 进入代码块中 str ====我被赋值了
4 进到普通代码块
5 进入构造器
构造器中 str====我被赋值了
a====0

由输出结果可以看到 调整顺序后的静态块和静态变量先后顺序发生改变

猜你喜欢

转载自www.cnblogs.com/tongAngle/p/10128133.html
今日推荐