`
ganglong99
  • 浏览: 161381 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

小代码分析

JVM 
阅读更多

请看如下这段小代码,结果输出什么呢?
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的编译过程需要理解。

0
0
分享到:
评论
Global site tag (gtag.js) - Google Analytics