Java类初始化实验

使用Eclipse,JCK1.8实验,实验代码如下。


public class ClassInitTest
{
	private static int a=2;
	
	public ClassInitTest()
	{
		System.out.println("ClassInitTest constructor:" + System.currentTimeMillis() + ": class name-" + getClass().getName());
	}
	
	private int b=4;
	
	public static void main(String[] args)
	{
		System.out.println("ClassInitTest main 1:" + System.currentTimeMillis() + ": a-" + a);
		Test test1 = new Test();
		System.out.println("ClassInitTest main 2:" + System.currentTimeMillis() + ": ClassInitTest: test1.t5-" + test1.t5);
		System.out.println("ClassInitTest main 3:" + System.currentTimeMillis() + ": ClassInitTest: test1.t7-" + test1.t7);
	}
}

class Test
{
	private int t1 = 7;
	private static int t2 = 4;
	private int t3 = 7;

	private static Test test2 = new Test();
//	private Test test3 = new Test();

	private int t4 = 5;
	public static int t5 = 3;
	private int t6 = 6;

	{
		int counter = 3;
		System.out.println("Test initial block 1st: " + System.currentTimeMillis() + ": t2-" + t2 + ", t5-"+ t5 + ", t7-" + t7 + ", t4-" + t4 + ", t6-" + t6 +", counter1-" + counter);
		counter ++;
	}
	public static int t7 = 4;
	public int t8 = 5;
	public static int t9 = 4;

	{
		System.out.println("Test initial block 2nd:: " + System.currentTimeMillis() + ": t7-" + t7 + ", t4-" + t4 + ", t8-" + t8);
	}

	public Test()
	{
		System.out.println("Test Constructor 1: " + System.currentTimeMillis() + ": t2 " + t2 + ", t5: "+ t5 + ", t7: " + t7);
		int counter = 0;
		++t5;
		System.out.println("Test Constructor 2: " + System.currentTimeMillis() + ": t2 " + t2 + ", t5: "+ t5 + ", t7: " + t7 + ", counter2: " + (++counter));
		++t7;
		System.out.println("Test Constructor 3: " + System.currentTimeMillis() + ": counter2: " + (++counter));

		System.out.println("Test Constructor 4: " + System.currentTimeMillis() + ": t2 " + t2 + ", t5: "+ t5 + ", t7: " + t7 + ": counter2: " + (++counter));
	}
}


打印结果如下:

ClassInitTest main 1:1487332792727:a-2

Test initial block 1st:1487332863609: t2-4, t5-0, t7-0, t4-5, t6-6, counter1-3

Test initial block 2nd::1487332880470: t7-0, t4-5, t8-5

Test Constructor 1: 1487332886302:t2 4, t5: 0, t7: 0

Test Constructor 2: 1487332887782:t2 4, t5: 1, t7: 0, counter2: 1

Test Constructor 3: 1487332888490:counter2: 2

Test Constructor 4: 1487332888902:t2 4, t5: 1, t7: 1: counter2: 3

Test initial block 1st:1487333194886: t2-4, t5-3, t7-4, t4-5, t6-6, counter1-3

Test initial block 2nd::1487333197646: t7-4, t4-5, t8-5

Test Constructor 1: 1487333198990:t2 4, t5: 3, t7: 4

Test Constructor 2: 1487333200494:t2 4, t5: 4, t7: 4, counter2: 1

Test Constructor 3: 1487333201654:counter2: 2

Test Constructor 4: 1487333202102:t2 4, t5: 4, t7: 5: counter2: 3

ClassInitTest main 2:1487333254326:ClassInitTest: test1.t5-4

ClassInitTest main 3:1487333255094:ClassInitTest: test1.t7-5


有些变量无法打印,所以最好的是利用我的代码,设好断点,单步调试,观察变量值。

结论如下:

Java类执行的流程:所有静态变量赋值为默认初始化值→从类头部第一个静态代码块开始顺序执行所有静态代码块(静态变量的声明也可看做是一个静态代码块)→非费静态成员变量声明语句或初始化代码块,二者按顺序谁在前谁先执行→构造方法→构造方法之后的其他静态代码。

在构造时的类中语句执行顺序:从类头部的第一个非费静态成员变量声明语句或初始化代码块开始执行→顺序执行静态变量声明语句→顺序执行构造方法中的语句。如果静态变量之前已经初始化,则直接跳到构造方法执行。


鸣谢:

感谢这两位作者的文章。

http://blog.youkuaiyun.com/u010444251/article/details/53107165

http://www.cnblogs.com/octobershiner/archive/2012/03/12/2391899.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值