提问人:blekione 提问时间:11/26/2012 最后编辑:Noel Mblekione 更新时间:11/27/2012 访问量:446
为什么这里使用最后一个关键字?
Why is the final keyword used here?
问:
我从《Java.如何编程“ P. & H. Deitel
在第 216 页上有一个示例,该示例用于变量之一final
private static final Random randomNumbers = new Random();
据我了解,变量均值中的声明最终,该变量是一种常量,这意味着初始化时您不能再更改它。 但是上面的 object(variable) 在程序中使用了两次来返回随机数
int die1 = 1 + randomNumbers.nextInt( 6 );
int die2 = 1 + randomNumbers.nextInt( 6 );
它返回 2 个不同的(随机)值。
我想我在这里失去了一些东西。程序运行良好,但我不明白在对象声明中使用的目的是什么?final
答:
final
意味着变量不能在这里改变它的值 - 事实上它不能也不会改变。
此处,变量的值是对 的实例的引用。它引用同一个实例,即使该实例每次调用时都会(可能)产生不同的数字。randomNumbers
Random
nextInt
区分不更改值的变量和它所引用的不更改内部状态的对象非常重要。再举一个例子,你可以有这样的东西:
public class Person {
private final List<Person> friends = new ArrayList<Person>();
public void addFriend(Person friend) {
friends.add(friend);
}
...
}
在这里,我们只有一个列表 - 你永远无法更改以引用不同的对象 - 但我们仍然可以改变变量引用的列表。friends
评论
randomNumbers
randomNumbers = Random(123456)
randomNumbers 的类型为 Random。也就是说,randomNumbers 是最终对象。不能将任何其他 Random 对象分配给它。您只是调用了该 randomNumbers 对象的方法两次。
除了乔恩说的。 final 的目的是避免在应用程序生命周期的不同阶段有两个 Random 类的实例被 randomNumber 变量引用。最明显的目的是避免不必要的对象创建。然而,使其成为最终的最重要(也是合乎逻辑的)原因是保持 randomNumbers 的高公平性。我的意思是,当您在 randomNumbers 上连续调用 nextInt 时,返回的结果必须是唯一的、随机的,并且与以前的结果不同,概率最高。假设您没有将其最终确定,那么与前一个 Random 实例的结果相比,稍后阶段的另一个 Random 实例可能会开始给出重复的值。为了避免这种情况,有必要使 randomNumbers 成为最终值
评论
一个词,当你使引用类型或基元类型最终确定为不可变时。 也就是说,您不能再更改该值了。
据我了解,变量均值的声明最终,即 变量是常数,
这只是对了一半,如果你标记一个变量 final,并不一定意味着它是常数。用静态 final 标记变量使其成为常量。
-将变量设为 final 将指示此变量的值不能更改。
private static final Random randomNumbers = new Random();
-在上面的一行中,是一个类型的对象引用变量,当它被标记时,它将始终锁定到该类型的 Random 对象上。randomNumbers
Random
final
-这里需要注意的非常重要的一点是,Random 对象没有被锁定,但对象引用变量被该特定的 Random 对象锁定。randomNumbers
注意:
final variable
:其值无法更改
final method
:不能被覆盖
final class
:无法扩展
final Parameter
:它的值不能从调用方的参数中接收到的更改
final Object Reference Variable
:它不能引用任何其他对象,除了它当前引用的对象
评论
final Object References Variable
将 Random 引用 (randomNumbers) 设置为 final 意味着不能为此特定引用分配另一个值。
也就是说,以下两个语句都将在编译时进行检查/报告。
a. randomNumbers = new Random();
b. Random someOtherRandomNumbers = new Random();
randomNumbers = someOtherRandomNumbers;
Final 意味着一旦启动了 referace 变量,就无法对其进行更改
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
评论