public class StaticVariableTest {
private static StaticVariableTest svt = new StaticVariableTest();//语句(1)
private int count1=5;//语句(2)
private static int count2=6;//语句(3)
private StaticVariableTest(){//语句(4)
count1++;
count2++;
}
public static StaticVariableTest getInstance(){//语句(5)
return svt;
}
public int getCount1() {
return count1;
}
public void setCount1(int count1) {
this.count1 = count1;
}
public static int getCount2() {
return count2;
}
public static void setCount2(int count2) {
StaticVariableTest.count2 = count2;
}
public static void main(String[] args) {
StaticVariableTest svt = StaticVariableTest.getInstance();//语句(6)
System.out.println("count1:" + svt.getCount1());//语句(7)
System.out.println("count1:" + svt.getCount2());//语句(8)
}
}
对比下面一个
public class StaticVariableTest {
private static StaticVariableTest svt = new StaticVariableTest();//语句(1)
private static int count1=5;//语句(2)
private static int count2=6;//语句(3)
private StaticVariableTest(){//语句(4)
count1++;
count2++;
}
public static StaticVariableTest getInstance(){//语句(5)
return svt;
}
public static int getCount1() {
return count1;
}
public static setCount1(int count1) {
StaticVariableTest.count1 = count1;
}
public static int getCount2() {
return count2;
}
public static void setCount2(int count2) {
StaticVariableTest.count2 = count2;
}
public static void main(String[] args) {
StaticVariableTest svt = StaticVariableTest.getInstance();//语句(6)
System.out.println("count1:" + svt.getCount1());//语句(7)
System.out.println("count1:" + svt.getCount2());//语句(8)
}
}
private static StaticVariableTest svt = new StaticVariableTest();//语句(1)
private int count1=5;//语句(2)
private static int count2=6;//语句(3)
private StaticVariableTest(){//语句(4)
count1++;
count2++;
}
public static StaticVariableTest getInstance(){//语句(5)
return svt;
}
public int getCount1() {
return count1;
}
public void setCount1(int count1) {
this.count1 = count1;
}
public static int getCount2() {
return count2;
}
public static void setCount2(int count2) {
StaticVariableTest.count2 = count2;
}
public static void main(String[] args) {
StaticVariableTest svt = StaticVariableTest.getInstance();//语句(6)
System.out.println("count1:" + svt.getCount1());//语句(7)
System.out.println("count1:" + svt.getCount2());//语句(8)
}
}
对比下面一个
public class StaticVariableTest {
private static StaticVariableTest svt = new StaticVariableTest();//语句(1)
private static int count1=5;//语句(2)
private static int count2=6;//语句(3)
private StaticVariableTest(){//语句(4)
count1++;
count2++;
}
public static StaticVariableTest getInstance(){//语句(5)
return svt;
}
public static int getCount1() {
return count1;
}
public static setCount1(int count1) {
StaticVariableTest.count1 = count1;
}
public static int getCount2() {
return count2;
}
public static void setCount2(int count2) {
StaticVariableTest.count2 = count2;
}
public static void main(String[] args) {
StaticVariableTest svt = StaticVariableTest.getInstance();//语句(6)
System.out.println("count1:" + svt.getCount1());//语句(7)
System.out.println("count1:" + svt.getCount2());//语句(8)
}
}
main()方法 是静态的 所以先执行 main()
private static Test svt;
private int count1;
private static int count2;
static{
svt = new Test();//调用构造函数,此时,count1=6;count2=1;
count2=6;//
}
private Test(){//
count1=5;
count1++;
count2++;
}
public static int count1=5;
为什么有static没有它执行的结果会不一样?谢谢
你的第一个例子不已经包含了两种情况,一种是有static(count2),一种没有static(count1),
这个清楚,第二题不就明白了
顺序:静态变量-》实例变量-》构造方法第一个例子:
首先试图初始化静态变量svt,结果碰到了=后边的构造方法:new StaticVariableTest();
但是在构造方法执行之前必须先初始化实例变量count1,于是先跑去执行语句(2),于是count1=5;
之后回来继续执行构造方法,于是count1加1变成6,count2由0变成1;
接下来轮到语句(3),于是count2重新被赋值变成6;
在接下来语句(6)(7)(8)取值,打印,
所以结果:6,6第二个例子:
不同的地方是,初始化静态变量svt,结果碰到了=后边的构造方法:new StaticVariableTest();时,不是再跑去先执行语句(2),因为此时的count1已经不是实例变量了,而是直接就去执行构造方法,于是count1,count2都由0变成了1。
接下来顺序执行语句(2)(3),于是count1,count2分别被重新赋值变成5,6
剩下的语句就是取值,打印
所以结果:5,6
你可以使用反编译工具 jad 看看。