日期:2014-05-20  浏览次数:20714 次

写出输出结果的java习题
class A{

private static A obj=new A();

public static int num1;

public static int num2=0;

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

}


我看来看去,经分析应该输出“1 1”,可是运行后输出的是“1 0”。帮忙分析一下,主要是运行过程是怎样的?

------解决方案--------------------
这个你在private A()这一行设置断点,然后调试运行就可以知道运行顺序如下:
①、A obj=A.getInstance();
②、private A(){
③、num1++;
④、num2++;}
⑤、private static A obj=new A();
⑥、public static int num2=0;
然后回到main方法。
我是这样想的,程序的运行顺序:先声明所有的静态变量(注意此处只是声明静态变量,但不初始化,没初始化的变量值为0),运行A obj=A.getInstance();运行getInstance()方法,初始化obj对象,初始化之前要先运行构造方法A(),
此时num1=1,num2=1
obj初始化之后,初始化num2。所以num2被重新赋值0
综上所述,最后输出的是obj.num1=1,obj.num2=0
------解决方案--------------------
Java code
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