我从“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
的目的是什么?
答案 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();
- 在上面一行中,randomNumbers
是Random
类型的对象引用变量,标记为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;