发新话题

谁能给我解释下这个小程序???

public class StaticTest
{
private static StaticTest st = new StaticTest();

private static int a;

private static int b = 0;

private StaticTest()
{
a ++;
b ++;
}

public static StaticTest getInstance()
{
return st;
}

public static void main(String[] args)
{
StaticTest.getInstance();
System.out.println("a:" + a);
System.out.println("b:" + b);
}

}

输出结果是 a=1;b=0
本人是菜鸟,给位达人给解释下,不胜感激!!
编辑 回复 快速回复 TOP
简单
private static StaticTest st = new StaticTest();
此语句会被先执行,由于其调用了构造器,所以此语句执行后
a=1
b=1

然后继续执行
private static int a;
private static int b = 0;

由于第一句没有赋值操作,所以跳过
第二句把b赋值为0
此时
a=1
b=0

OK
快乐渡过每一天,减肥坚持每一天
编辑 回复 快速回复 TOP
厉害~~
编辑 回复 快速回复 TOP
路过
学习中
编辑 回复 快速回复 TOP
学习了 好久没有接触这个了
编辑 回复 快速回复 TOP
同样学习了
编辑 回复 快速回复 TOP
luguo
未来→在哪里?
编辑 回复 快速回复 TOP
路过学习
编辑 回复 快速回复 TOP
强悍呀
编辑 回复 快速回复 TOP
都是执行顺序惹的祸!
编辑 回复 快速回复 TOP
you have debug run ?
编辑 回复 快速回复 TOP
JAVA类创建的流程是:1、初始化实例域为默认值,数值型设置为0、布尔型设置为false、所有对象变量设置为null;2、执行实例域的赋值语句,如果只是定义变量名而未初始化或赋值则保持该变量为默认值(注释:按照语句出现的顺序初始化);3、执行构造方法
此程序特殊之处在于将构造方法强制性的提前到a和b赋值前去了,a和b的默认值都是0,构造器运行后a和b都由0变为1,然后将b的值赋值为0,a的值保持不变。所以输出a:1 b:0
编辑 回复 快速回复 TOP
请问a和b的初值呢?
编辑 回复 快速回复 TOP
请问a和b的初值呢?
编辑 回复 快速回复 TOP
发新话题