未初始化的最终局部变量与未初始化的最终实例变量
Un-initialized final local variable vs un-initialized final instance variable
据我所知,最终变量 must/can 只能初始化一次,否则编译器应该会抛出错误。
如果最终实例变量 x
未初始化,则会抛出错误,但当局部变量 y
在以下代码中保持未初始化时,我没有遇到任何错误:
import java.util.*;
public class test
{
final int x = 5;// if final variable x uninitialized, compilation error occurs
public static void main(String[] args)
{
final int y; // y is not initialized, **no error is thrown**
System.out.println("test program");
}
}
未使用局部变量,因此可以保持未初始化状态
尝试使用它时会出现编译错误(即使不是final
):
System.out.println("test program" + y);
The local variable y may not have been initialized
根据final变量的定义,它们只能被初始化一次。在您的代码中,您还没有初始化 'y' 并且您也没有在任何地方使用它。
但是如果您执行以下操作,
final int y;
System.out.println(y);
你会得到'variable y might not have been initialized'
当您尝试使用已声明的 final 变量时会出现错误。
System.out.println(y);
Java Language Specification 没有声明 final
变量 必须 赋值(强调我的):
A final
variable may only be assigned to once.
并且:
A blank final
is a final variable whose declaration lacks an initializer.
因此您的 y
变量是一个 空白 final
,并且由于您的代码中没有进一步引用它,因此最好将其未分配.
import java.util.*;
public class test
{
final int x = 5;
public static void main(String[] args)
{
final int y;
System.out.println("test program");
y=6;
y=7;
}
}
y=7
会报错:The final local variable y may already have been assigned
。因为是final
变量,所以赋值给了6
.
恕我直言,final
局部变量意味着一旦赋值,就不能重新赋值。但是通过 final int y
你只是声明了一个没有赋值(初始化)的 final
变量,这在 Java 中是合法的。(但是为了使用它你仍然必须初始化它,或者一个发生错误。)
更新:
正如下面的评论,您已经注意到 class field
最终变量和 local
最终变量之间的区别。
来自 Java 语言规范:
- a
final field
必须是 definely assigned
在 static initializer
或 constructor
中:
8.3.1.2 final Fields
A field can be declared final (§4.12.4). Both class and instance variables (static
and non-static fields) may be declared final.
A blank final class variable must be definitely assigned by a static initializer of
the class in which it is declared, or a compile-time error occurs (§8.7, §16.8).
A blank final instance variable must be definitely assigned at the end of every
constructor of the class in which it is declared, or a compile-time error occurs (§8.8,
§16.9).
(注意非final字段可以不初始化)
2.A局部变量(无论是否为final)在使用前必须显式赋值:(chapter 4.12.5,P88)
• A local variable (§14.4, §14.14) must be explicitly given a value before it is
used, by either initialization (§14.4) or assignment (§15.26), in a way that can be
verified using the rules for definite assignment (§16 (Definite Assignment)).
据我所知,最终变量 must/can 只能初始化一次,否则编译器应该会抛出错误。
如果最终实例变量 x
未初始化,则会抛出错误,但当局部变量 y
在以下代码中保持未初始化时,我没有遇到任何错误:
import java.util.*;
public class test
{
final int x = 5;// if final variable x uninitialized, compilation error occurs
public static void main(String[] args)
{
final int y; // y is not initialized, **no error is thrown**
System.out.println("test program");
}
}
未使用局部变量,因此可以保持未初始化状态
尝试使用它时会出现编译错误(即使不是final
):
System.out.println("test program" + y);
The local variable y may not have been initialized
根据final变量的定义,它们只能被初始化一次。在您的代码中,您还没有初始化 'y' 并且您也没有在任何地方使用它。
但是如果您执行以下操作,
final int y;
System.out.println(y);
你会得到'variable y might not have been initialized'
当您尝试使用已声明的 final 变量时会出现错误。
System.out.println(y);
Java Language Specification 没有声明 final
变量 必须 赋值(强调我的):
A
final
variable may only be assigned to once.
并且:
A blank
final
is a final variable whose declaration lacks an initializer.
因此您的 y
变量是一个 空白 final
,并且由于您的代码中没有进一步引用它,因此最好将其未分配.
import java.util.*;
public class test
{
final int x = 5;
public static void main(String[] args)
{
final int y;
System.out.println("test program");
y=6;
y=7;
}
}
y=7
会报错:The final local variable y may already have been assigned
。因为是final
变量,所以赋值给了6
.
恕我直言,final
局部变量意味着一旦赋值,就不能重新赋值。但是通过 final int y
你只是声明了一个没有赋值(初始化)的 final
变量,这在 Java 中是合法的。(但是为了使用它你仍然必须初始化它,或者一个发生错误。)
更新:
正如下面的评论,您已经注意到 class field
最终变量和 local
最终变量之间的区别。
来自 Java 语言规范:
- a
final field
必须是definely assigned
在static initializer
或constructor
中:8.3.1.2 final Fields A field can be declared final (§4.12.4). Both class and instance variables (static and non-static fields) may be declared final. A blank final class variable must be definitely assigned by a static initializer of the class in which it is declared, or a compile-time error occurs (§8.7, §16.8). A blank final instance variable must be definitely assigned at the end of every constructor of the class in which it is declared, or a compile-time error occurs (§8.8, §16.9).
(注意非final字段可以不初始化)
2.A局部变量(无论是否为final)在使用前必须显式赋值:(chapter 4.12.5,P88)
• A local variable (§14.4, §14.14) must be explicitly given a value before it is used, by either initialization (§14.4) or assignment (§15.26), in a way that can be verified using the rules for definite assignment (§16 (Definite Assignment)).