一段static量被多次初始化的代码(很奇怪)问题如上,代码如下:package com.ant.testpublic class TestSynch
一段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域中,有没有朋友有什么方法?
[其他解释]这没什么奇怪的,你想要什么样的
[其他解释]static变量不应该是只会被实例化一次吗?怎么会一个实体类被实例化多次?
------其他解决方案--------------------
实在不好意思,现在才结贴。问题总结如下:如果这么写private static Entry entry=new Entry(1);那么只会被初始化一次,而如果放在initial函数中则被初始化了N次,其根本原因是,java在实例化一个对象时总是会先检查该类的成员变量,如果有static域,且还没被初始化,那么static域会被初始化,因此第一种写法,static域只被初始化一次,因为这句话他永远只能被执行一次(同一虚拟机);而第二种写法,作为一个static函数而言,他可以被无限次的调用,那么他就不存在所谓的有没有被初始化了(因为java没有这样的机制)。综上,static域初始化最好放在域后边。
OK,结贴。