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

?求助,高手请进,很让我郁闷的两个程序
/此程序输出1和0

public class TestTwo
{
public static void main(String[] args)
{
Test test = Test.getInstance();
System.out.println("var1="+Test.var1);
System.out.println("var2="+Test.var2);
}
}


class Test
{

private static Test test = new Test();
public static int var1;
public static int var2 = 0;
private Test()
{
var1++;
var2++;
}

public static Test getInstance()
{
return test;
}

}



[size=24px[b]]//输出1 和1[/b][/size]
public class TestTwo
{
public static void main(String[] args)
{
Test test = Test.getInstance();
System.out.println("var1="+Test.var1);
System.out.println("var2="+Test.var2);
}
}


class Test
{


public static int var1;
public static int var2 = 0;
private static Test test = new Test();
private Test()
{
var1++;
var2++;
}

public static Test getInstance()
{
return test;
}

}



------解决方案--------------------
首先有一點你要明确的就是,java里面的静态变量初始化是有顺序的:自上而下的执行。。。。所以你顺序不同将会出现不同的结果,这个没什么好大惊小怪的。。淡定;
具体分析:程序一:你对象实例化在前,当调用构造方时发现var1++,就去找到这个var1属性(全局int属性默认值为0),现在Test对象存在于内存当中且var1=1,同样var2=1,再往下走发现var1就只是声明而没有再次赋值(因为var1经有值了,内存里分配空间了。没有初始化,不可以被引用),var1=1不变,而遇到var2=0时,var2重新赋值,var2=0,,,这就是改程序输出为:1 0的原因
程序二:首先是var1声明(默认值为零),var2=0;对象实例化调用构造函数后var1=1,var2=1结果程序输出:1 1 就这么简单,,,,,了解了一些基本的底层原理,一些想不通的问题可能其实就是规定的,,推荐《Thinking in java 4th》