3

我从“Java。如何编程”P. & H. Deitel 一书中学习finaljava

private static final Random randomNumbers = new Random();

据我了解变量中的 final 声明,该变量是一种常量,这意味着初始化时您不能再更改它。但是上面的对象(变量)在程序中使用了两次以返回随机数

int die1 = 1 + randomNumbers.nextInt( 6 );
int die2 = 1 + randomNumbers.nextInt( 6 );

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

4

7 回答 7

12

final意味着变量不能在这里改变它的值——事实上它不能也不会。

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

区分不改变值的变量和它所指的不改变内部状态的对象很重要。作为另一个例子,你可以有这样的东西:

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

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

    ...
}

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

于 2012-11-26T09:41:00.390 回答
2

除了乔恩所说的。final 的目的是避免在应用程序生命周期的不同阶段有两个由 randomNumber 变量引用的 Random 类实例。最明显的目的是避免不必要的对象创建。然而,使它成为最终的最重要(也是合乎逻辑的)原因是保持随机数的公平性很高。我的意思是,当您在 randomNumbers 上连续调用 nextInt 时,返回的结果必须是唯一的、随机的并且以最高概率与先前的结果不同。假设您没有将其设为最终结果,那么与之前的 Random 实例的结果相比,稍后阶段的另一个 Random 实例可能会开始给出重复值。为了避免这种情况,有必要使 randomNumbers 最终

于 2012-11-26T09:44:19.953 回答
2

一句话,当您将引用类型或原始类型设为 final 时,它是不可变的。即,您不能再更改该值。

据我了解变量均值中的最终声明,该变量是一种常量,

这只是对了一半,如果您将变量标记为 final 并不一定意味着它是常量。用static final标记变量使其成为常量。

于 2012-11-26T09:44:50.167 回答
2

-将变量设为 final 将表明该变量的值不能更改。

private static final Random randomNumbers = new Random();

-在上面的行中,randomNumbers是一个类型的对象引用变量Random,当它被标记final时,它将始终被锁定到该随机类型的对象上。

-这里要注意的非常重要的一点是,随机对象没有被锁定,但对象引用变量 randomNumbers特定的随机对象锁定。

笔记:

final variable:它的值不能改变

final method: 不能被覆盖

final class: 不能扩展

final Parameter:它的值不能改变,它从调用者的参数接收到

final Object Reference Variable:它不能引用任何其他对象,除了它当前引用的对象

于 2012-11-26T09:46:08.107 回答
2

Final 意味着您无法更改引用变量,一旦它被初始化

For example

final Object obj = new Object();  //initialized 

now that doesnot mean that u cant call methods on obj

obj.someOperation1() //allowed
obj.someOperation2() //allowed
obj.anyOperationAnyTime() //allowed


But u cant assign new object to referance obj
final Object obj = new Object();  //initialized 
obj =  new Object() //now allowed , you cant make obj to point to new referance
于 2012-11-26T10:05:23.833 回答
0

randomNumbers 的类型是随机的。那就是 randomNumbers 是一个最终的对象。不能将任何其他 Random 对象分配给它。而且您只是两次调用该 randomNumbers 对象的方法。

于 2012-11-26T09:43:33.267 回答
0

将 Random 引用 (randomNumbers) 设置为 final 意味着您不能为该特定引用分配另一个值。

也就是说,以下两个语句都将在编译时检查/报告。

a. randomNumbers = new Random(); 

b. Random someOtherRandomNumbers = new Random(); 
   randomNumbers = someOtherRandomNumbers; 
于 2012-11-26T09:59:06.647 回答