Java 成员变量 静态块 构造块 构造方法执行顺序测试

时间:2022-04-29 19:34:11

public class T3 {
static int k=0;
static int i=print("i");
static T3 t=new T3(1);
static String x="xxx";
static int m=print("m");
int j=print("j");
int s=print("s");
T3(int a)
{
System.out.println("构造方法:k="+k+"\ti="+i+"\tm="+m);
m=a;
System.out.println("m="+m);
System.out.println(x);
}

{
System.out.println("构造块");
}

static {
System.out.println("静态块");
}

static int print(String str)
{
System.out.println("成员变量:"+str+" "+i);
return ++i;
}

public static void main(String[] args) {
T3 t1=new T3(3);
T3 t2=new T3(4);
}
}


运行结果:

成员变量:i 0
成员变量:j 1
成员变量:s 2
构造块
构造方法:k=0 i=3 m=0
m=1
null
成员变量:m 3
静态块
成员变量:j 4
成员变量:s 5
构造块
构造方法:k=0 i=6 m=4
m=3
xxx
成员变量:j 6
成员变量:s 7
构造块
构造方法:k=0 i=8 m=3
m=4
xxx

推测执行顺序:

1.main中new一个对象时的执行顺序: 静态成员变量初始化->静态块->非静态成员变量初始化->构造块-构造方法

2.静态变量从上到下一个个初始化,如排在前面的静态变量初始化中又用到构造方法,则调用“非静态变量初始化->构造块->构造方法”,这过程中可能使用到的排在其后面的静态变量(还未开始初始化的)都取default值,一般整数是取0;string取null等

3.以后每次构造对象的执行顺序:非静态变量->构造块->构造方法

4.静态块只在所有静态变量都初始化完成之后第一次new对象时(10月5日纠正:应该是首次load类的时候)执行一次,构造块和构造方法在每一次new对象时,非静态变量初始化完成后一次各执行一次

10.5补充:构造块也叫动态语句块,每new一个对象调用一次,相当于加在了类的每一个构造方法之前,所以它执行完之后就开始构造方法。