静态块和在类中分配静态之间的区别?

时间:2014-06-05 10:18:57

标签: java static

以下两个静态变量初始化之间是否有任何区别:

class Class1 {    
    private static Var var;

    static {
        var = getSingletonVar();
    }  
}

class Class2 {
    private static var = getSingletonVar;
}

这两种初始化静态变量的方法在功能上是否相同?

4 个答案:

答案 0 :(得分:3)

是的,功能相同。

来自Java doc

There is an alternative to static blocks — you can write a private static method:

class Whatever {
    public static varType myVar = initializeClassVariable();

    private static varType initializeClassVariable() {

        // initialization code goes here
    }
}

The advantage of private static methods is that they can be reused later if you need to reinitialize the class variable.

答案 1 :(得分:1)

结果将是相同的。

在这两种情况下,静态变量将通过类加载进行初始化。

静态方法和静态类块是两回事。 需要调用静态方法,因为静态类块会自动通过类加载执行。

答案 2 :(得分:0)

首先你没有在这里声明静态方法。 可能如果你想知道执行的顺序

1) constructors

创建实例时调用,完全独立于#2发生的时间,或者即使它始终发生

2)static methods

当你调用它们时调用,完全独立于#1何时发生,或者甚至根本不发生

3)static blocks

在初始化类时调用,这可能发生在#1或#2之前。

答案 3 :(得分:0)

静态初始化器和静态块都在初始化类时运行。存在静态块是因为有时你想在初始化时做一些不能被描述为简单赋值的东西:

static final Logger log = Logger.getLogger(ThisClass.class);
static final String PROPS_FILE = "/some/file.properties";
static final Properties gProps;
static {
    gProps = new Properties();
    try {
        FileReader reader = new FileReader(PROPS_FILE);
        try {
            gProps.load(reader);
        } finally {
            reader.close();
        }
    } catch (IOException e) {
        throw new SomeException("Failed to load properties from " + PROPS_FILE, e);
    }
    log.info(ThisClass.class.getName() + " Loaded");
}