Java基础学习1

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);
}
}


运行结果了下测试结果,与以前理解的确实一样
[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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值