java 中局部最终变量的行为
behaviour of local final variable in java
我知道这可能会遭到反对,但这让我很感兴趣
public class finaltesting
{
public static final String v=900; //requires initialization
public static void main(String []args)
{
final int c; // doesn't need initialization
switch(get())
{
case 0:
System.out.println("zero");
break;
case 1:
System.out.println("one");
break;
case 2:
System.out.println("two");
break;
case 3:
System.out.println("three");
}
}
static int get()
{
return (int)(Math.random()*4);
}
}
但是最终变量需要正确初始化..所以为什么 "final int c;"
没有任何编译错误
这是否意味着最终实例变量和最终局部变量完全不同
(*对于那些认为 'how a final variable works' 可能重复的人来说,这不是关于本地和实例最终变量)
您的局部变量 c 没有给出错误,因为它不是静态字段。您的实例变量被定义为静态最终变量,因此需要初始化。
规则是这样的:
Each local variable (§14.4) and every blank final field (§4.12.4,
§8.3.1.2) must have a definitely assigned value when any access of its
value occurs.
An access to its value consists of the simple name of the variable
(or, for a field, the simple name of the field qualified by this)
occurring anywhere in an expression except as the left-hand operand of
the simple assignment operator = (§15.26.1).
For every access of a local variable or blank final field x, x must be
definitely assigned before the access, or a compile-time error occurs.
所以重要的是,当你访问一个变量时,final 字段(或任何局部变量)已经被赋值。如果您从不访问它,则无需执行任何操作。 (值得注意的是,final 和非 final 局部变量的规则是一样的。唯一的区别是 final 局部变量不能再次赋值给 .)
对于局部变量,编译器可以保证它不会被访问,因此不需要赋值。
对于一个字段,这并不总是可能的,因此只有在 constructor/static 初始化程序块中初始化的最终字段才被认为是明确分配的(取决于该字段是否是静态的)。
的规则中对所有这些进行了更详细的描述
我知道这可能会遭到反对,但这让我很感兴趣
public class finaltesting
{
public static final String v=900; //requires initialization
public static void main(String []args)
{
final int c; // doesn't need initialization
switch(get())
{
case 0:
System.out.println("zero");
break;
case 1:
System.out.println("one");
break;
case 2:
System.out.println("two");
break;
case 3:
System.out.println("three");
}
}
static int get()
{
return (int)(Math.random()*4);
}
}
但是最终变量需要正确初始化..所以为什么 "final int c;"
没有任何编译错误这是否意味着最终实例变量和最终局部变量完全不同
(*对于那些认为 'how a final variable works' 可能重复的人来说,这不是关于本地和实例最终变量)
您的局部变量 c 没有给出错误,因为它不是静态字段。您的实例变量被定义为静态最终变量,因此需要初始化。
规则是这样的:
Each local variable (§14.4) and every blank final field (§4.12.4, §8.3.1.2) must have a definitely assigned value when any access of its value occurs.
An access to its value consists of the simple name of the variable (or, for a field, the simple name of the field qualified by this) occurring anywhere in an expression except as the left-hand operand of the simple assignment operator = (§15.26.1).
For every access of a local variable or blank final field x, x must be definitely assigned before the access, or a compile-time error occurs.
所以重要的是,当你访问一个变量时,final 字段(或任何局部变量)已经被赋值。如果您从不访问它,则无需执行任何操作。 (值得注意的是,final 和非 final 局部变量的规则是一样的。唯一的区别是 final 局部变量不能再次赋值给 .)
对于局部变量,编译器可以保证它不会被访问,因此不需要赋值。
对于一个字段,这并不总是可能的,因此只有在 constructor/static 初始化程序块中初始化的最终字段才被认为是明确分配的(取决于该字段是否是静态的)。
的规则中对所有这些进行了更详细的描述