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

java static final成员变量,初始化,存不存在线程安全问题?
先说 

class Test{
static final String strName="abc";
}

这种赋值,听人说,是只有在第一个对象实例化的时候会赋值,是吗?


class Test{
static final HashMap<String, String> hm = new HashMap<String, String>();
Test()
{
hm.put("abc","123");
}
}


这种类型,只能在构造函数里初始化,要怎么只初始化一次呢?(只从语言角度讲,先不考虑hashTable了)

------解决方案--------------------
把?HashMap提到类外边,做个单例
------解决方案--------------------
class base
{
public base()
{
System.out.println("base");
}
}

class useBase
{
static final base b=new base();

public useBase()
{

}
}

public class classTest {
public static void main(String args[])
{
useBase ub1=new useBase();
useBase ub2=new useBase();
}
}

------解决方案--------------------
第一种是不是在第一个对象实例化的时候赋值的,是在jvm启动的时候被赋值的;
第二种也不是只能在构造函数里初始化,你可以做个测试,调用的时候你一样可以对他进行put进对象,我的理解是,用final修饰的变量,它指向的内存地址就是固定死了,但里面存放的内容可以发生变化。