初始化最终字段

时间:2013-11-30 07:00:11

标签: java final

此Q而非验证:

静态最终字段可以在声明时初始化:

public static final int i=87;

或在静态区块中:

public static final int i;

//..........

static {
    ...
    i=87;
    ...

}

除了静态块之外,还有静态最终字段

public static final int i;

可以初始化吗?

提前致谢。

注意:看到了Initialize a static final field in the constructor。静态块是唯一在声明之外初始化它的地方并不具体。

// ==============

ADD:

延伸@noone的答案,回应@Saposhiente的下面:

在某些非静态环境中混合:

public class FinalTest {

private static final int INT = new FinalTest().test();

private int test() {
    return 5;
}
}

4 个答案:

答案 0 :(得分:3)

Java Language Specification

  

如果是一个空白的final(§4.12.4)类变量,那么这是一个编译时错误   没有通过静态初始化器(第8.7节)明确赋值(第16.8节)   声明它的类。

答案

  

除了静态块之外,还有静态最终字段   可以初始化吗?

不,没有。

答案 1 :(得分:1)

没有。 static字段属于该类,并且final字段必须在其可见时分配,因此必须使用声明或{}初始化static final字段在一个静态初始化程序中(它们都被编译成相同的东西),以便在类加载完成后它有一个值。

答案 2 :(得分:1)

它可以在任何随机静态方法中“初始化”,但只能间接使用static块或变量初始化。

public class FinalTest {

    private static final int INT = test();

    private static int test() {
        return 5;
    }
}

或者像这样:

public class FinalTest {

    private static final int INT;

    static {
        INT = test();
    }

    private static int test() {
        return 5;
    }
}

从技术上讲,它不是test()中的初始化,但它就像一个。

答案 3 :(得分:0)

它只能在一组始终只运行一次的静态代码中初始化。这通常是在声明或静态块中,但你也可以做一些奇怪的事情,如

static final int i;
static int j = i = 1;

从技术上讲,这两者都不是。无论哪种方式,您都无法在任何类型的函数或构造函数中初始化它,因为该函数可能会运行多次;你必须使用静态声明或代码块来运行该函数并使用返回值来初始化它。