Java では、変更されない値を持つキーワード (final) と呼ばれる定数。static 修飾子を宣言せずに定数を作成する人を見てきました。私の質問は、定数を静的として宣言する必要がありますか? そうである場合、またはそうでない場合、その理由は何ですか?
6 に答える
変数を宣言するときに変数に値を割り当てる場合、各インスタンスには同じ値を持つ独自の変数があり、無駄であるため、final
それが でなくても意味がありません。static
ただし、値を 1 回しか設定できないインスタンス変数が必要な場合 (ただし、インスタンスによって値が異なる場合があります)、その変数は である必要がありますが、そうでfinal
はありませんstatic
。
例えば :
class Person
{
final int id;
public Person(int id) {
this.id = id;
}
}
最初に、定数の機能を理解する必要があります (つまり、フィールド / ローカル変数を としてマークするとどうなるかfinal
)。
プリミティブ/文字列フィールドが としてマークされるとfinal
、コンパイル時の定数になります。つまり、その値はバイトコード自体の一部として渡されます。したがって、その値は実行時に計算/生成されません。これにより、パフォーマンスが向上します。
このキーワードstatic
は、このフィールドはクラスの各インスタンスに対して一意ではないという意味で使用されます。非静的final
定数も使用できます。また、メソッド ローカル変数 (プリミティブ) が とマークされているfinal
場合、それも定数になります。
いいえ、static
定数とは何の関係もありません。デザイン選びです。
キーワードを含む定数final
は変更されません。実際には、このフィールドが参照しているインスタンスを変更することはできませんが、このインスタンス内の値を変更することはできます。
次の例を想像してください。
class SomeClass {
final Car MYCAR;
...
}
このコードでは、次の参照を変更できませんMYCAR
。
MYCAR = new Car(.....);
しかし、次のようなことができます:
MYCAR.setPrice(10000);
そうstatic
です、インスタンスがSomeClass
オブジェクトの独自のコピーを持つ必要があるが、MYCAR
誰もこのオブジェクトの参照を変更したくない場合は、このフィールドを作成しないことに意味があります。
final
技術的には、割り当てられた最終変数の値を変更することはできないため、定数にはキーワードで十分です。
static
定数が特定のオブジェクト インスタンスに関連付けられていない場合に使用する必要があります。
たとえば、Circle
クラスがあり、面積を計算するメソッドがあるとします。Pi
この目的のために定数が必要です。Pi
定数は円から円へと変化しません。したがって、Pi を static final として宣言することは理にかなっています。
君が好きなものならなんでも。私は個人的に静的を使用します。static として宣言する場合、オブジェクトを作成する必要はありません。また、すべての定数を格納する「定数」ファイルを作成することもできます。public final static ...
したがって、すべてのオブジェクトで使用される「定数」である場合は、基本的に static final を使用します。そうでない場合は、最終的なものにしてコンストラクターに渡します。
クラスでキーワードを使用するstatic
と、クラスのすべてのインスタンス。つまり、クラスのすべてのオブジェクトは同じ変数を共有します。クラスを final として宣言すると、インスタンス化できません (オブジェクトを作成できません)。したがって、変数 final を宣言すると、一度だけ値を割り当てることができます。仮定しましょう
class CalculateArea {
final static double PI = 3.1417;
/*write rest of the code to calculate area.
the value of PI will remain constant no matter
how many times its object is made
if you try to override the value of `PI` it will raise an error.
*/
}