Java加载顺序以前没有怎么深究,这段时间再看《s深入研究虚拟机》,测试了下加载顺序
代码
运行结果了下测试结果,与以前理解的确实一样
[b]结果:[/b]
初始化----
1
2
2
并不是想象的2,3,2
这个确实和虚拟机加载的方式有区别,顺序应该是
1、初始化时,TestLoad test =null, int a, int b,都会被放入java栈中,此时a 和 b均为初始值0;而类信息,静态方法。方法修饰等后悔被放入方法区
2、执行 new TestLoad() 初始化方法,此时a和b均为1,
3、加载静态变量 ,此时a和b重新赋值,,
4、对于实例变量,在调用时才会生成内存空间,不论在什么时候调用。所以c一调用,就会分配内存空间并且赋值,所以第一次就是1;
将代码修改下就能完全看出加载顺序
输出结果为:
代码
/**
* <p>Description:TODO</p>
*
* @author esdong
* 2015-10-14
*/
public class TestLoad {
public static TestLoad test = new TestLoad();
public static int a = 1;
public static int b = 2;
public int c = 1;
private TestLoad(){
a ++;
b ++;
c ++;
}
public static TestLoad getInstence (){
return test;
}
public static void main(String[] args) {
TestLoad test1 = TestLoad.getInstence();
System.out.println(test1.a);
System.out.println(test1.b);
System.out.println(test1.c);
}
}
运行结果了下测试结果,与以前理解的确实一样
[b]结果:[/b]
初始化----
1
2
2
并不是想象的2,3,2
这个确实和虚拟机加载的方式有区别,顺序应该是
1、初始化时,TestLoad test =null, int a, int b,都会被放入java栈中,此时a 和 b均为初始值0;而类信息,静态方法。方法修饰等后悔被放入方法区
2、执行 new TestLoad() 初始化方法,此时a和b均为1,
3、加载静态变量 ,此时a和b重新赋值,,
4、对于实例变量,在调用时才会生成内存空间,不论在什么时候调用。所以c一调用,就会分配内存空间并且赋值,所以第一次就是1;
将代码修改下就能完全看出加载顺序
public class TestLoad {
public static TestLoad test = new TestLoad();
public static int a = 1;
public static int b = 2;
public int c = 1;
{
System.out.println(a);
System.out.println(b);
System.out.println(c);
}
static{
System.out.println("静态方法----");
}
private TestLoad(){
System.out.println("初始化----");
a ++;
b ++;
c ++;
}
private void test(){
System.out.println("初始化test----");
}
public static TestLoad getInstence (){
System.out.println("实例调用---");
return test;
}
public static void main(String[] args) {
TestLoad test1 = TestLoad.getInstence();
test1.test();
System.out.println(test1.a);
System.out.println(test1.b);
System.out.println(test1.c);
}
}
输出结果为:
0
0
1
初始化----
静态方法----
实例调用---
初始化test----
1
2
2