1 class FinalTest
{
public static final String staticValue1 = "静态变量1";
public static final String staticValue2;
static
{
staticValue2 = "静态变量2";
}
public final String value1 = "实例变量1";
public final String value2;
public final String value3;
{
value2 = "实例变量2";
}
public FinalTest()
{
value3 = "实例变量3";
}
}上面的代码为什么没有报错,刚才测试了,不是说用final修饰的变量必须赋值的吗。
{
public static final String staticValue1 = "静态变量1";
public static final String staticValue2;
static
{
staticValue2 = "静态变量2";
}
public final String value1 = "实例变量1";
public final String value2;
public final String value3;
{
value2 = "实例变量2";
}
public FinalTest()
{
value3 = "实例变量3";
}
}上面的代码为什么没有报错,刚才测试了,不是说用final修饰的变量必须赋值的吗。
{
staticValue2 = "静态变量2";
}
在静态初始化块中赋值了。
public final String value3;
class FinalTest
{
//定义时赋值
public static final String staticValue1 = "静态变量1";
//在 static 初始化块 中赋值 所以正确
public static final String staticValue2;
static
{
staticValue2 = "静态变量2";
}
//在定义时赋值
public final String value1 = "实例变量1";
//对象初始化块中被赋值,而且限于,所以正确,但不可再在构造器中复制
public final String value2;
//在构造器中初始化,所以正确。
public final String value3;
{
value2 = "实例变量2";
}
public FinalTest()
{
value3 = "实例变量3";
}
}
对于静态final变量,最晚在静态初始化块中赋值。