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

一段static量被屡次初始化的代码(很奇怪)

2012-12-16 
一段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变量了,都放在static域中,有没有朋友有什么方法?
[其他解释]
这没什么奇怪的,你想要什么样的

[其他解释]
static变量不应该是只会被实例化一次吗?怎么会一个实体类被实例化多次?
------其他解决方案--------------------


实在不好意思,现在才结贴。问题总结如下:如果这么写private static Entry entry=new Entry(1);那么只会被初始化一次,而如果放在initial函数中则被初始化了N次,其根本原因是,java在实例化一个对象时总是会先检查该类的成员变量,如果有static域,且还没被初始化,那么static域会被初始化,因此第一种写法,static域只被初始化一次,因为这句话他永远只能被执行一次(同一虚拟机);而第二种写法,作为一个static函数而言,他可以被无限次的调用,那么他就不存在所谓的有没有被初始化了(因为java没有这样的机制)。综上,static域初始化最好放在域后边。
OK,结贴。

热点排行