首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

static 关键字的有关问题

2012-05-16 
static 关键字的问题Java codepackage tandeyclass Singleton{public static Singleton singleton new S

static 关键字的问题

Java code
package tandey;class Singleton{        public static Singleton singleton =new Singleton();    public static int count1;    public static int count2=0;    //public static Singleton singleton =new Singleton();    public Singleton() {      count1++;      count2++;    }        public static Singleton getSingleton(){        return singleton;    }}public class Mytest {    public static void main(String[] args) {       Singleton singleton=Singleton.getSingleton();       System.out.println(Singleton.count1);       System.out.println(Singleton.count2);     }}

如代码:
执行结果:
1
0
关于这个如何分析?求赐教

[解决办法]
public static int count2=0;
相当于2条语句
public static int count2; //定义
static {count2=0;} //赋值
定义语句在执行代码之前,因为定义语句就是把变量编译成相对地址(在java中就是索引号)
所以
定义语句先执行,然后
public static Singleton singleton =new Singleton(); //这里先执行,调用构造方法count1=1,count2=1
public static int count1; //然后这里没有执行代码
public static int count2=0;//然后这里执行static{count2=0;}使得count2又变成了0

LZ自己体会一下以下的例子
public class A {
static {System.out.println("1");}
static A a = new A();
static {System.out.println("3");}
static int b = 3;
static {System.out.println("4");}
static {b = 4;}

public A () {System.out.println("2");}

public static void main(String[] args) {
System.out.println(A.b);
}
}

[解决办法]
首先碰到这句话Singleton singleton=Singleton.getSingleton();
载入Singleton 类 静态初始化 执行public static Singleton singleton =new Singleton();
那么count1++;count2++;所以他们都是1.然后继续 public static int count1;
public static int count2=0;count1还是1,count2被赋值成0;



[解决办法]
Singleton singleton=Singleton.getSingleton();
 由于调用了Singleton的静态方法,属于"主动使用"的情况,因此会导致Singleton类的加载,它的加载分为三部:
 1.加载
 2.连接(在此阶段中,所有静态变量赋值为默认值,这里singleton为null,count1和count2为0)
 3.初始化:
调用类初始化方法<clinit>,按照代码的顺序依次初始化,先对singleton变量初始化,会调用new Singleton();所以调用到了构造器导致count1和count2的值都变成了1;
再对count1进行初始化,由于这里count1没有初始化语句,所以什么也不做;
再对count2进行初始化,由于这里语句为"count2=0"所以count2又变成了0;

打印出来的结果是1,0

热点排行