クラスの最終インスタンス変数がある場合、それはクラスで作成されたオブジェクトごとにインスタンス化されますか、それとも一度作成されて参照されるだけですか?
そして、最後の変数がローカルクラス変数である場合はどうなりますか?
4 に答える
修飾子はfinal
、変数を一度だけ割り当てることができ、二度と割り当てることができないことを示すだけです。インスタンス化には影響しません。ルールは通常の変数の場合と同じです。修飾子が行うのは、final
値が2回割り当てられるのを防ぐことだけです。
以下の例。
private final List myList = new ArrayList();
リストは、これが実行されるたびに、つまり、囲んでいるクラスがインスタンス化されるたびにインスタンス化されます。
public void bob() {
final List myList = new ArrayList();
}
リストは、これが実行されるたびに、つまりメソッドbob
が呼び出されるたびにインスタンス化されます。
private static final List MY_LIST = new ArrayList();
この場合も、これが実行されるたびにリストがインスタンス化されます。これはstatic
フィールド初期化子でもあるため、このコードはクラスが最初にロードされたときに実行されます。したがって、単純なプログラムの場合、これは1回実行されます。複数のクラスローダーが使用されているシナリオ(アプリサーバーなど)では、ただし、クラスが新しいクラスローダーにロードされるたびに1回実行されます。
最終変数は、クラスのインスタンスごとにインスタンス化されます。一度割り当てられた値は変更できません。これらの変数は、初期化子または代入ステートメントのいずれかを介して一度初期化できます。
あなたが参照しているのは静的変数です。これらの変数は特定のオブジェクトに関連付けられているのではなく、クラス全体に関連付けられています。これらは、クラスがロードされるときに割り当てられます。
これら2つを組み合わせると、クラスの静的なfinal変数を持つことができます。これは基本的に、一度割り当てられた変数に割り当てられた値が一定であり、クラスのインスタンスではなくクラスにアタッチされることを意味します。
インスタンス変数、クラス変数、およびローカル変数は、3つの異なるものを参照するために使用されるため、変数を「クラスのインスタンス変数」または「ローカルクラス変数」と呼ぶと混乱します。
インスタンス変数はオブジェクトに属しています。それがそうであるかどうかにかかわらfinal
ず、スペースはそれのためにすべてのインスタンスに割り当てられます。の場合final
、構築中に値を割り当てる必要があり、変数は1回だけ割り当てることができます。
クラス変数は、クラス全体に属します。そのクラスのオブジェクトの数に関係なく、変数は1つだけであり、すべてのインスタンスがそれを参照できます。変数をとして宣言するstatic
ことは、それがクラスに属することを意味します。インスタンス変数と同様に、static
クラス変数を宣言できますfinal
。次に、クラスの初期化時に1回だけ値を割り当てる必要があります。
ローカル変数はメソッド内で宣言され、変数はメソッドスタックフレーム内のスペースを占有しますが、その変数はヒープ内のオブジェクトへのポインターを保持する場合があります。ローカル変数はfinal
、にすることができます。つまり、一度だけ割り当てることができます。また、ローカル変数がfinal
である場合、メソッドでインスタンス化された内部クラスによって参照できます。
変数は、インスタンス化される変数ではありません。クラスがインスタンス化されます。変数が初期化されます。インスタンス変数は、オブジェクトが構築されるまでに初期化する必要があります。初期化されている場合、インスタンス変数にfinal
値を再割り当てすることはできません。インスタンス変数の場合、クラスの各インスタンスには独自のコピーがあります。それ以外の場合、静的な場合は、クラス自体に属するコピーが1つだけになります。