欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java基础学习1

程序员文章站 2022-07-15 13:58:41
...
Java加载顺序以前没有怎么深究,这段时间再看《s深入研究虚拟机》,测试了下加载顺序
代码
/**
 * <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


相关标签: java基础