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

一段static量被多次初始化的代码(很奇怪)
问题如上,代码如下:

package com.ant.test;

public class TestSynchronized {

private static Entry entry=null;

// static{
// entry=new Entry(1);
// }
public TestSynchronized()
{
initial();
}

private static void initial()
{
entry=new Entry(1);
}

public synchronized void get()
{

}
public static void main(String[] args)
{
TestSynchronized test1=new TestSynchronized();
TestSynchronized test2=new TestSynchronized();
TestSynchronized test3=new TestSynchronized();
}
}

class Entry{

public Entry(int i)
{
System.out.println("初始化i:"+i);
}

private int i;

public int getI() {
return i;
}

public void setI(int i) {
this.i = i;
}

}

实体entry被多次实例化了,求解?
------解决方案--------------------
楼主,呵呵

    private static Entry entry=null;
        static{
        entry=new Entry(1);
    }
这个会执行一次。因为这是静态块。

然后
 TestSynchronized test1=new TestSynchronized();
他调用出化方法
 public TestSynchronized()
    {
        initial();
    }
    
    private static void initial()
    {
        entry=new Entry(1);
    }
这里当然再执行一次。
接下来两个同理。


一个是静态方法 private static void initial(),一个是静态块static{}。
前面那个是构造函数调的,后面那个是加载main时候就调用了。
静态方法当然可以反复调用,否则静态方法.....





------解决方案--------------------
我改了一下代码:

   private static void initial()
    {
System.out.println("---entry is  "+entry);
        entry=new Entry(1);
System.out.println("entry is  "+entry);
    }
    



从结果上看,entry变量只有第一次生成TestSynchronized 对象时,被初始化为null了。
等到执行构造方法时,entry就不再为null了,而是:
entry is  com.ant.test.Entry@1fb8ee3
你第二次生成TestSynchronized 对象时,
语句:
private static Entry entry=null;
就再不会执行了。(这就是定义成静态的作用,只初始化一次)。
这时 
entry is  com.ant.test.Entry@61de33

------解决方案--------------------
静态变量当然不应该在构造方法中实例化。静态变量属于整个类,而构造方法属于对象。初始化静态对象应该在静态域里。当然 ,在对象方法中可以对静态变量进行更改。

引用:
目前我都不敢在构造方法中实例化static变量了,都放在static域中,有没有朋友有什么方法?