Java中的实例变量作为final
实例变量:众所周知,当变量的值因对象而异时,这种类型的变量称为实例变量。实例变量是在类中声明的,但不在任何方法、构造函数、块等中。如果我们不初始化实例变量,那么 JVM 会根据该实例变量的数据类型自动提供默认值。
但是如果我们将实例变量声明为final ,那么我们必须要注意实例变量的行为。
- 没有要求将变量设为最终变量。但是,当您确实明确打算永远不更改变量时,最好将其设为 final
- 在创建不可变类时,我们必须使用实例变量作为最终变量。
关于最终实例变量的要点:
- 变量初始化强制:如果实例变量声明为final,那么无论我们是否使用它,我们都必须显式地执行初始化,并且JVM不会为final实例变量提供任何默认值。
// Java program to illustrate the behavior // of final instance variable class Test { final int x; public static void main(String[] args) { Test t = new Test(); System.out.println(t.x); } }
输出:
error: variable x not initialized in the default constructor
- 构造函数完成前的初始化:对于最终实例变量,我们必须在构造函数完成之前执行初始化。我们可以在声明的时候初始化一个最终的实例变量。
// Java program to illustrate that // final instance variable // should be declared at the // time of declaration class Test { final int x = 10; public static void main(String[] args) { Test t = new Test(); System.out.println(t.x); } }
输出:
10
- 在非静态或实例块内初始化:我们也可以在非静态或实例块内初始化最终实例变量。
// Java program to illustrate // that final instance variable // can be initialize within instance block class Test { final int x; { x = 10; } public static void main(String[] args) { Test t = new Test(); System.out.println(t.x); } }
输出:
10
- 默认构造函数中的初始化:在默认构造函数中,我们还可以初始化最终实例变量。
// Java program to illustrate that // final instance variable // can be initialized // in the default constructor class Test { final int x; Test() { x = 10; } public static void main(String[] args) { Test t = new Test(); System.out.println(t.x); } }
输出:
10
上面提到的是对最终实例变量执行初始化的唯一可能的地方。如果我们尝试在其他任何地方执行初始化,那么我们将得到编译时错误。
// Java program to illustrate
// that we cant declare
// final instance variable
// within any static blocks
class Test {
final int x;
public static void main(String[] args)
{
x = 10;
Test t = new Test();
System.out.println(t.x);
}
}
输出:
error: non-static variable x cannot be referenced from a static context
// Java program to illustrate that we
// cant declare or initialize
// final instance variable within any methods
class Test {
final int x;
public void m()
{
x = 10;
}
}
输出:
error: cannot assign a value to final variable x