码迷,mamicode.com
首页 > 其他好文 > 详细

类加载的顺序,便于理解的比较好的一个程序

时间:2016-08-18 21:14:37      阅读:110      评论:0      收藏:0      [点我收藏+]

标签:

网上的程序,自己看了一个小时,终于看明白了,感觉挺有收获

 

public class StaticTest {
/*main函数初始化,执行F行,先给静态变量分配内存,默认填值0;或者null(引用变量);然后给静态变量赋值;进行到第A行,给t1赋值的时候
* 要new一个对象,此时静态变量已经全部分配内存空间并默认填值0或者null了,所以这个时候第A行
* 执行初始化这个类的时候不会再给静态变量分配内存并默认填值,而是直接执行C中的普通变量的初始化,这个时候
* 调用print("j")这个方法,因为这个时候k从0自加了1,所以是1,i和n都还没有赋值,是分配内存的时候的原始值
* 0,这就是第一行的输出结果。对象实例化的时候要执行普通代码块,所以执行print("构造块"),这个时候i和n已经在
* 刚才print("j")这个方法调用的时候,自加过一次,所以现在的值为2;同理执行静态块的道理一样;执行完普通代码块,
* 才开始执行构造器方法,所以这个时候输出t1开头的值;同理,接下来的5-8条输出也是一样的道理的;
* 执行完AB之后,开始给D行的静态变量初始化,执行print"i"方法,输出i,也就是第9条的结果。然后执行E行,将99赋予n,赋予之前n的值是8!!
* 这个时候F行语句还没执行完,只执行到E这里,要接着往下执行,调用print("j"),输出第10行,然后11-12两个普通代码块
* 然后init为参数的构造方法(13行)。
*
*/
public static int k = 0;
public static StaticTest t1 = new StaticTest("t1");//A
public static StaticTest t2 = new StaticTest("t2");//B
public static int i = print("i");//D
public static int n =99;//E
public int j = print("j");//C
{
print("构造块");
}
{
print("静态块");
}
public StaticTest(String str){
System.out.println((++k)+":"+str+"i="+i+"n="+n);
++n;
++i;
}
public static int print(String str){
System.out.println((++k)+":"+str+"i="+i+"n="+n);
++i;
return ++n;
}
public static void main(String[] args) {
new StaticTest("init");//F
// StaticTest.print("123");
}

}

 

输出结果:

1:ji=0n=0
2:构造块i=1n=1
3:静态块i=2n=2
4:t1i=3n=3
5:ji=4n=4
6:构造块i=5n=5
7:静态块i=6n=6
8:t2i=7n=7
9:ii=8n=8
10:ji=9n=99
11:构造块i=10n=100
12:静态块i=11n=101
13:initi=12n=102

类加载的顺序,便于理解的比较好的一个程序

标签:

原文地址:http://www.cnblogs.com/chuliang/p/5785202.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!