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