Java基础学习1
程序员文章站
2022-07-15 13:55:49
...
Java加载顺序以前没有怎么深究,这段时间再看《s深入研究虚拟机》,测试了下加载顺序
代码
运行结果了下测试结果,与以前理解的确实一样
结果:
初始化----
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); } }
运行结果了下测试结果,与以前理解的确实一样
结果:
初始化----
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
上一篇: Redis 安装学习
下一篇: 免费资源