为什么在这里使用final关键字?

ble*_*one 3 java

我从书籍"Java.如何编程"中学习Java P.&H.Deitel在页216中有一个例子用于final其中一个变量

private static final Random randomNumbers = new Random();
Run Code Online (Sandbox Code Playgroud)

据我所知,变量均值中的声明最终,该变量是一种常量,这意味着当初始化时你不能再改变它.但上面的对象(变量)在程序中使用两次以返回随机数

int die1 = 1 + randomNumbers.nextInt( 6 );
int die2 = 1 + randomNumbers.nextInt( 6 );
Run Code Online (Sandbox Code Playgroud)

它返回2个不同的(随机)值.我想我在这里丢了东西.程序运行良好,但我不明白final在对象声明中使用的目的是什么?

Jon*_*eet 12

final意味着变量不能在这里改变它的值 - 实际上它不能也不能.

这里randomNumbers变量的值是对实例的引用Random.它指的是同一个实例,即使该实例每次调用时都会产生(可能)不同的数字nextInt.

区分不变量值的变量和不改变内部状态的对象是很重要的.再举一个例子,你可以这样:

public class Person {
    private final List<Person> friends = new ArrayList<Person>();

    public void addFriend(Person friend) {
        friends.add(friend);
    }

    ...
}
Run Code Online (Sandbox Code Playgroud)

这里我们只有一个列表 - 你永远不能改变friends引用不同的对象 - 但我们仍然可以改变变量所引用的列表.