4

Java では、変更されない値を持つキーワード (final) と呼ばれる定数。static 修飾子を宣言せずに定数を作成する人を見てきました。私の質問は、定数を静的として宣言する必要がありますか? そうである場合、またはそうでない場合、その理由は何ですか?

4

6 に答える 6

4

変数を宣言するときに変数に値を割り当てる場合、各インスタンスには同じ値を持つ独自の変数があり、無駄であるため、finalそれが でなくても意味がありません。static

ただし、値を 1 回しか設定できないインスタンス変数が必要な場合 (ただし、インスタンスによって値が異なる場合があります)、その変数は である必要がありますが、そうでfinalはありませんstatic

例えば ​​:

class Person 
{
    final int id;
    public Person(int id) {
        this.id = id;
    }
}
于 2015-09-14T07:13:34.260 に答える
2

最初に、定数の機能を理解する必要があります (つまり、フィールド / ローカル変数を としてマークするとどうなるかfinal)。

プリミティブ/文字列フィールドが としてマークされるとfinalコンパイル時の定数になります。つまり、その値はバイトコード自体の一部として渡されます。したがって、その値は実行時に計算/生成されません。これにより、パフォーマンスが向上します。

このキーワードstatic、このフィールドはクラスの各インスタンスに対して一意ではないという意味で使用されます。非静的final定数も使用できます。また、メソッド ローカル変数 (プリミティブ) が とマークされているfinal場合、それも定数になります。

いいえ、static定数とは何の関係もありません。デザイン選びです。

于 2015-09-14T07:14:14.313 に答える
1

キーワードを含む定数finalは変更されません。実際には、このフィールドが参照しているインスタンスを変更することはできませんが、このインスタンス内の値を変更することはできます。

次の例を想像してください。

class SomeClass {
    final Car MYCAR;
    ...
}

このコードでは、次の参照を変更できませんMYCAR

MYCAR = new Car(.....);

しかし、次のようなことができます:

MYCAR.setPrice(10000);

そうstaticです、インスタンスがSomeClassオブジェクトの独自のコピーを持つ必要があるが、MYCAR誰もこのオブジェクトの参照を変更したくない場合は、このフィールドを作成しないことに意味があります。

于 2015-09-14T07:14:45.723 に答える
0

final技術的には、割り当てられた最終変数の値を変更することはできないため、定数にはキーワードで十分です。

static定数が特定のオブジェクト インスタンスに関連付けられていない場合に使用する必要があります。

たとえば、Circleクラスがあり、面積を計算するメソッドがあるとします。Piこの目的のために定数が必要です。Pi定数は円から円へと変化しません。したがって、Pi を static final として宣言することは理にかなっています。

于 2015-09-14T07:13:44.090 に答える
0

君が好きなものならなんでも。私は個人的に静的を使用します。static として宣言する場合、オブジェクトを作成する必要はありません。また、すべての定数を格納する「定数」ファイルを作成することもできます。public final static ...

したがって、すべてのオブジェクトで使用される「定数」である場合は、基本的に static final を使用します。そうでない場合は、最終的なものにしてコンストラクターに渡します。

于 2015-09-14T07:14:02.710 に答える
0

クラスでキーワードを使用する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.
    */
}
于 2015-09-14T07:27:36.343 に答える