小代码分析

请看如下这段小代码,结果输出什么呢?
public class Singleton {
private static Singleton obj = new Singleton();
public static int counter1;
public static int counter2 = 0;

private Singleton() {
counter1++;
counter2++;
}

public static Singleton getInstance() {
return obj;
}

public static void main(String[] args) {
Singleton obj = Singleton.getInstance();
System.out.println("obj.counter1==" + obj.counter1);
System.out.println("obj.counter2==" + obj.counter2);
}
}

这段代码的输出是什么样的呢?
结果是:
obj.counter1==1
obj.counter2==0

相信看到这个结果很多人都不知所措,下面分析一下执行过程:
1.首先,编译器加载这个类,为每个变量分配内存,此时:
obj=null,counter1=0,counter2=0;

2.然后,按照各变量的声明顺序,为变量赋初值,先为obj赋值:
obj=new Singleton();调用Singleton()构造函数,counter1和counter2分别加1,变为counter1=1,counter2=1。

3.接着为counter1赋值,但没有指定初值,因此仍然为1。

4.接着为counter2赋初值为0,结果,counter2又被变回了0.
所以最终结果是counter1=1,counter2=0。

那么,要是将第一行代码的位置改到第三行后,即:
public class Singleton {
public static int counter1;
public static int counter2 = 0;
private static Singleton obj = new Singleton();

private Singleton() {
counter1++;
counter2++;
}

public static Singleton getInstance() {
return obj;
}

public static void main(String[] args) {
Singleton obj = Singleton.getInstance();
System.out.println("obj.counter1==" + obj.counter1);
System.out.println("obj.counter2==" + obj.counter2);
}
}
结果输出会是怎样的呢?
下面我们还是按照上面的思路来分析:
1.第一步一样,分配内存:counter1=0,counter2=0,obj=null。

2.按声明顺序赋初值,counter1未指定初值,因此仍然为0;counter2指定了初值为0。

3.为obj赋初值为
obj=new Singleton();调用构造函数,counter1和counter2均加1,结果counter1=1,counter2=1。
所以最后输出结果为:
counter1==1
counter2==1

可见,将private static Singleton obj = new Singleton();这行代码的位置调换,结果就不一样,其中的原理, JVM的编译过程需要理解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值