跳转至内容

Java 编程/关键字/final

来自维基教科书,自由的教科书

final 是一个关键字。注意!它的含义取决于它用于类、方法还是变量。它必须放在变量类型或方法返回类型之前。建议将其放在访问修饰符之后以及static 关键字之后。

Example 代码部分 1:关键字顺序。
private static final long serialVersionUID = -5437975414336623381L;

对于变量

[编辑 | 编辑源代码]

final 关键字只允许对变量进行一次赋值。也就是说,一旦变量被赋值,它的值就变成了只读。如果变量是基本类型,它的值将不再改变。如果它是一个对象,只有它的引用将不再改变。请记住,它的值仍然可以改变。

Warning 代码部分 2:禁止双重赋值。
final int a = 1;
a = 2;
Example 代码部分 3:只修改对象的价值。
final ArrayList list = new ArrayList();
System.out.println(list.size());
list.add("One item");
System.out.println(list.size());
Standard input or output 代码部分 3 的控制台
0
1

一个 final 变量经常被用于通用常量,例如 pi

Example 代码部分 4:Pi 常量。
static final double PI = 3.1415926;

final 关键字也可以用于方法参数

Example 代码部分 5:final 方法参数。
public int method(final int inputInteger) {
   int outputInteger = inputInteger + 1;
   return outputInteger;
}

它对于使用副作用更新某些对象的方法很有用。此类方法修改了作为参数传递的对象的内容。方法调用者将收到对象更新。如果对象参数在方法中被重新赋值,这将失败。将更新另一个对象而不是。final 方法参数也可以用于保持代码整洁。

final 关键字类似于其他语言中的const 关键字和 C# 中的readonly 关键字。final 变量不能是volatile

对于类

[编辑 | 编辑源代码]

final 关键字禁止创建子类。这是 IntegerString 类的案例。

Computer code 代码清单 1:SealedClass.java
public final class SealedClass {
  public static void main(String[] args) {
  }
}

final 类不能是abstractfinal 关键字类似于 C# 中的sealed 关键字。

对于方法

[编辑 | 编辑源代码]

final 关键字禁止在子类中覆盖方法。如果类已经是 final,并且私有方法隐式地是final,那么它就毫无用处。final 方法不能是abstract

Computer code 代码清单 2:NoOverwriting.java
public class NoOverwriting {
  public final void sealedMethod() {
  }
}

final 关键字主要用于保证代码的良好使用。例如(非static)方法,这允许编译器扩展方法(类似于内联函数),如果方法足够小。有时需要使用它。例如,嵌套类只能访问顶层类的成员,如果它们是 final。

另见 访问修饰符
华夏公益教科书