3

本「Java. How to Program」から Java を学びます。P. & H. Deitel の 216 ページには、final変数の 1 つで使用される例があります

private static final Random randomNumbers = new Random();

変数の意味で最終的な宣言を理解している限り、その変数は一種の定数です。つまり、初期化されたときにそれを変更することはできません。しかし、上記のオブジェクト(変数)はプログラムで2回使用され、乱数を返します

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);
    }

    ...
}

ここではリストが 1 つしかありませんfriends。別のオブジェクトを参照するように変更することはできませんが、変数が参照するリストを変更することはできます。

于 2012-11-26T09:41:00.390 に答える
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 に答える
2

In addition to what Jon has said. The purpose of final was to avoid having two instances of Random class referred by randomNumber variables at different stage of application lifecycle. On most obvious purpose is that it is to avoid unnecessary object creations. However the most important (and logical) reason of making it final is to keep the fairness of randomNumbers high. What I mean is that when you call nextInt in succession on randomNumbers then the result returned has to be unique, random and different from previous results with highest probability. Suppose you do not make it final then another instance of Random at later stage may start giving duplicate values when compared to results of previous instance of Random. To avoid this its necessary to make randomNumbers final

于 2012-11-26T09:44:19.953 に答える
2

one word, when you make a reference type or a primitive type final its immutable. i.e., you cant change the value anymore.

As far as I understand declaration final in variable mean, that variable is kind of constant,

This is only half right, if you mark a variable final it doesn't necessarily mean that its constant. marking a variable with static final makes it a constant.

于 2012-11-26T09:44:50.167 に答える
2

-変数を final にすることは、この変数の値を変更できないことを示します。

private static final Random randomNumbers = new Random();

-上記の行でrandomNumbersは、タイプのオブジェクト参照変数Randomであり、マークされているfinalため、常にタイプ Random のオブジェクトにラッチされます。

-ここで注意すべき非常に重要なことは、Random オブジェクトはロックされていませんが、オブジェクト参照変数 randomNumbersその特定の Random オブジェクトでロックされているということです。

ノート:

final variable: その値は変更できません

final method: オーバーライドできません

final class:延長不可

final Parameter: 呼び出し元の引数から受け取った値は変更できません

final Object Reference Variable: 現在参照しているオブジェクト以外のオブジェクトは参照できません

于 2012-11-26T09:46:08.107 に答える
0

the type of randomNumbers is Random. That is randomNumbers is a final object. Any other Random objects cannot be assigned to it. And you are just calling a method of that randomNumbers Object twice.

于 2012-11-26T09:43:33.267 に答える
0

ランダム参照 (randomNumbers) を final として設定すると、この特定の参照に別の値を割り当てることができないことを意味します。

つまり、次の両方のステートメントがコンパイル時にチェック/レポートされます。

a. randomNumbers = new Random(); 

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