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

时间:2012-11-26 09:38:22

标签: java

我从“Java。如何编程”一书中学习Java。 H. Deitel 在页216上有一个示例,其中一个变量

中使用final
private static final Random randomNumbers = new Random();

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

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

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

7 个答案:

答案 0 :(得分: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来引用不同的对象 - 但是我们仍然可以改变变量所引用的列表。

答案 1 :(得分:2)

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

答案 2 :(得分:2)

一个词,当你创建一个引用类型或一个原始类型final时它是不可变的。即你不能再改变它了。

  

据我所知,变量意味着声明最终,那   变量是一种常数,

这只是一半,如果你标记一个变量final,它并不一定意味着它的常量。使用静态最终标记变量使其成为常量。

答案 3 :(得分:2)

- 将变量设为final表示无法更改此变量的值。

private static final Random randomNumbers = new Random();

- 在上面一行中,randomNumbersRandom类型的对象引用变量,标记为final它将始终锁定在Random类型的对象上。

- 此处需要注意的是,Random对象未锁定,但对象引用变量 randomNumbers 已锁定随机对象。

注意:

final variable:无法更改其值

final method:无法覆盖

final class:无法扩展

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

收到

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

答案 4 :(得分:2)

最终意味着一旦初始化参考变量就无法更改

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

答案 5 :(得分:0)

randomNumbers的类型是Random。那就是randomNumbers是最终的对象。无法为其分配任何其他Random对象。而你只是两次调用randomNumbers对象的方法。

答案 6 :(得分:0)

将Random reference(randomNumbers)设置为final意味着您无法为此特定引用指定其他值。

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

a. randomNumbers = new Random(); 

b. Random someOtherRandomNumbers = new Random(); 
   randomNumbers = someOtherRandomNumbers;