java基础--构造函数、构造代码块、成员变量的显初始化执行顺序

36 阅读1分钟

先看一段代码,包含了构造函数、构造代码块、成员变量的显初始化。会输出什么呢?

class Test{	
    //构造函数
    public Test(){
        i = 300;	
    }

    //构造代码块
    {
        i = 200;
    }

    //成员变量的显初始化
    int i = 100;	 

    public static void main(String[] args) 
    {
        Test test = new Test();
        System.out.println("i = "+test.i);
    }
}

答案是 i = 300

执行反编译

01.png

看到构造代码块会被java编译器放在构造函数里面,成员变量的显初始化也会被放在构造函数里面。而构造函数的中代码是最后执行的。

修改源代码

class Test{	

    //构造代码块
    {
        i = 200;
    }	
    
    //成员变量的显初始化
    int i = 100; 

    public static void main(String[] args) 
    {
        Test test = new Test();
        System.out.println("i = "+test.i);
    }
}

这时候输出的结果是 i = 100

再修改源代码

class Test{	

    //成员变量的显初始化
    int i = 100; 

    //构造代码块
    {
        i = 200;
    }

    public static void main(String[] args) 
    {
        Test test = new Test();
        System.out.println("i = "+test.i);
    }
}

这时候输出的结果是 i = 200

总结

  1. java编译器编译后,构造代码块会被移动到构造函数中执行,是在构造函数之前执行。
  2. 成员变量的显示初始化也会被移动构造函数中执行,也是在构造函数之前执行。
  3. 构造函数的中代码是最后执行的。
  4. 构造代码块成员变量的显示初始化是按照当前代码的顺序执行。