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

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一个对象调用一次,相当于加在了类的每一个构造方法之前,所以它执行完之后就开始构造方法。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值