日期:2014-05-20 浏览次数:20769 次
class A{ public static int num1; public static int num2 = 0; private static A obj=new A(); private A(){ num1++; num2++; } public static A getInstance(){ return obj; } } public class Test{ public static void main(String[] args){ A obj=A.getInstance(); System.out.println("obj.num1="+obj.num1); System.out.println("obj.num2="+obj.num2); } }
------解决方案--------------------
经过设置断电执行后,我觉得程序是这样执行的
当执行到这一句时:A obj=A.getInstance(); jvm首先会把class A加载到内存,此时所有成员变量均为默认值,然后初始化静态变量,即先执行private static A obj=new A(); 此时会调用构造函数private A();这时num1,num2均为默认值,即都为0;执行完num1++; num2++; 之后num1,num2都等于1.然后从构造函数返回继续执行public static int num1;
public static int num2=0;
执行完这两句后num1=1,num2=0;
在然后执行getInstance()方法返回obj;所以会打印1和0
你可以在构造函数中添加几条打印语句,就很清除了,比如把构造函数改成这样:
private A() {
System.out.println(num1);
System.out.println(num2);
num1++;
num2++;
System.out.println(num1);
System.out.println(num2);
}
执行完这个构造函数后,会输出一下内容
0
0
1
1