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

J的结果为什么是0
public   class   testString   {
private   static   testString   s   =   new   testString();

private   static   int   i;

private   static   int   j=0;

public   testString()   {
System.out.println( "i= "+i+ "     "+ "j= "+j);
i++;
j++;
System.out.println( "i= "+i+ "     "+ "j= "+j);
}

public   static   testString   getInstance()   {
return   s;
}

public   static   void   main(String[]   args)   {
testString   s   =   testString.getInstance();
System.out.println( "==s=== "   +   s.s);
System.out.println( "=====i====== "   +   i);
System.out.println( "=====j====== "   +   j);
}
}

------解决方案--------------------
因为j是static变量,不属于对象,而属于整个类
------解决方案--------------------
private static testString s = new testString();

private static int i;

private static int j=0;
------------------------------------------------------
关键是这三行的顺序,这里也是顺序执行的,
构造函数执行完后,private static int j=0,又一次把j的值置成0了

private static testString s = new testString();
这句应放在最后

------解决方案--------------------
这与程序的执行顺序有关。
载入类的时候,运行时先初使化testString的s instance,在初使化s时调用了testString的构造函数,这个时候i = 1,j = 1.而后执行private static int i及private static int j=0.实际上,i和j在之前已经初使化了。在执行private static int i时没有更改i的值,而执行private static int j=0时相当于执行了一次j=0的操作。所以最终结果为i=1,j=0.
------解决方案--------------------
初始化顺序先对静态成员变量进行声明,同时赋初始值,然后顺序执行静态部分的所有语句,而声明中如果赋值的话到这时才运行。
------解决方案--------------------
public class DateTest {
private static String s = "1 ";

public static void main(String[] args) {
DateTest d1 = new DateTest();
DateTest.s = "aa ";
DateTest d2 = new DateTest();
d2.s = "bb ";
DateTest d3 = new DateTest();
d3.s= "cc ";

System.out.println(d1.s);
System.out.println(d2.s);
System.out.println(d3.s);
}
}

看这个例子,正如1楼说的那样,静态变量是属于类的.所有此类的对象共用