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楼说的那样,静态变量是属于类的.所有此类的对象共用