Java中有关变量初始化先后顺序的思考和实验(二)

来源:互联网 发布:如何修改淘宝账号名称 编辑:程序博客网 时间:2024/05/16 01:44


三、多种初始化过程的先后顺序

上一篇文章中已经说明,初始化过程分为:默认初始化、显示初始化、构造代码块初始化和构造函数初始化。就其先后顺序,构造函数初始化是最后进行,其他三种初始化我们仍然需要分为静态变量和非静态变量讨论。但静态变量的另三种初始化过程(构造函数初始化除外)先于非静态变量。

对于静态变量,默认初始化、显示初始化、构造代码块初始化的先后顺序由其代码的前后位置决定,代码位置靠前的将先执行。由于默认初始化伴随着静态变量的声明,显示初始化只能接在变量声明之后,所以一般而言,对于同一个静态变量,先执行默认初始化,再执行显示初始化,最后执行构造代码块初始化。

对于非静态变量,同静态变量。

见如下代码实验:

class A{A()  //代码区1:构造器初始化{x=3;z=3;System.out.println("nonstatic gouzaohanshu Init...z..."+z);System.out.println("static gouzaohanshu Init...x..."+x);}int z=printInit("nonstatic xianshi Init...z");   //代码区2:非静态变量z显示初始化//代码区3:非静态变量z构造代码块初始化{z=2;System.out.println("nonstatic gouzaodaimakuai Init...z..."+z);}static int x=printInit("static xianshi Init...x");//代码区4:静态变量x显示初始化static int y;//代码区5:静态变量y默认初始化//代码区6:静态变量y构造代码块初始化static{System.out.println("static gouzaodaimakuai Init...y..."+y);}//代码区7:静态变量x构造代码块初始化static{x=2;System.out.println("static gouzaodaimakuai Init...x..."+x);}private static int printInit(String s){System.out.println(s);return 1;}}class  InitDemo{public static void main(String[] args) {A a=new A();}}

其运行结果如下图所示:



尽管非静态变量z先于静态变量x和y声明和初始化,但最后的执行结果显示x和y先进行初始化,且x和y的初始化顺序和其代码定义的前后位置有关。容易看出,int类型的默认初始化值为0。至于结果的最后两行先打印z,再打印x,则和初始化顺序无关,是由构造函数中的方法调用先后顺序决定的。

若只看静态变量x,我们可以发现,先进行默认初始化,再进行显示初始化,最后进行构造代码块初始化。

0 0
原创粉丝点击