56

私は、人々が書いpublic static final String mystring = ... てから値を使用するコードをたくさん見てきました。

なぜ彼らはそれをしなければならないのですか?final値を使用する前に値を初期化する必要があるのはなぜですか?

アップデート

わかりました、すべての回答に感謝します。これらのキーの意味を理解しています (public static final)。私が理解していないのは、定数が1つの場所でのみ同じクラスでのみ使用される場合でも、人々がそれを使用する理由です。なぜそれを宣言するのですか?変数を使用しないのはなぜですか?

4

13 に答える 13

93

final変数の値が変更されないことを示します。つまり、宣言後に値を変更できない定数です。

次のような を作成する場合に使用public final static StringしますString

  1. クラスに属しています ( static: それを使用するために必要なインスタンスはありません)。
  2. 変更されません ( )。たとえば、クラスのすべてのインスタンス、およびクラスを使用する他のオブジェクトで使用できる定数finalを定義したい場合、およびそのString
  3. クラスが世界を示すインターフェイスの公開された部分になります。

例:

public final static String MY_CONSTANT = "SomeValue";

// ... in some other code, possibly in another object, use the constant:
if (input.equals(MyClass.MY_CONSTANT)

同様に:

public static final int ERROR_CODE = 127;

を使用する必要はありませんfinalが、プログラムの実行中に定数が誤って変更されるのを防ぎ、変数が定数であることを示す指標として機能します。

定数が現在のクラスおよび/または 1 つの場所でのみ使用 (読み取り) される場合でも、すべての定数をfinal次のように宣言することをお勧めします。より明確であり、コードの存続期間中に定数が使用される可能性があります。複数の場所。

さらに、 using を使用finalすると、定数が使用されている実際の値をインライン化するなど、実装で何らかの最適化を実行できる場合があります。

final最後に、プリミティブ型から真の定数値のみを作成し、不変であることに注意してくださいStringfinalオブジェクト (たとえば a HashMap) に適用すると、参照は不変になりますが、オブジェクトの状態は変更できません。たとえば、オブジェクトのデータ メンバーを変更したり、配列要素を変更したり、コレクションを操作および変更したりできます。

于 2012-07-26T20:40:51.177 に答える
12
  1. 静的な手段..クラスをインスタンス化したり、オブジェクトを使用したりせずに使用できます。
  2. final..文字列を定数にするためのキーワードです。その文字列の値を変更することはできません。以下の例を見てください。

      public class StringTest { 
               static final String str = "Hello"; 
      public static void main(String args[]) { 
               // str = "world"; // gives error 
               System.out.println(str); // called without the help of an object                       
               System.out.println(StringTest.str);// called with class name  
                 } 
             } 
    

ありがとう

于 2014-04-05T22:49:18.613 に答える
5

キーワードfinalは、値が定数であることを意味します (変更できません)。C の const に似ています。

また、 staticをスコープを持つグローバル変数として扱うことができます。これは基本的に、1 つのオブジェクトに対して変更すると、グローバル変数のようにすべてのオブジェクトに対して変更されることを意味します (スコープによって制限されます)。

それが役に立てば幸い。

于 2012-07-26T21:07:28.930 に答える
4

staticこれは、オブジェクトが1回だけ作成され、それを含むインスタンスオブジェクトがないことを意味します。あなたが書いた方法は、クラスのすべてのオブジェクトに共通であり、決して変更されないものがある場合に最もよく使用されます。オブジェクトをまったく作成せずに使用することもできます。

final通常、コンパイラがそのルールを適用し、確実にわかるように、finalを使用することが期待される場合に使用するのが最善です。staticすべてのオブジェクトで同じ値になる場合は、メモリを浪費して同じものを多数作成しないようにします。

于 2012-07-26T20:43:34.900 に答える
2

final一度設定すると値が変更できないことを示します。 static値を設定できます。その値は、それを利用するクラスのすべてのインスタンスで同じになります。public staticまた、クラスのインスタンスを持たない文字列の値にアクセスすることもできます。

于 2012-07-26T20:42:05.893 に答える
2

publicは、他のクラスからアクセスできるようにします。クラスをインスタンス化したり、オブジェクトを使用したりせずに使用できます。

staticは、すべてのクラス インスタンスで値を統一します。すべてのオブジェクトで同じ値になる場合、同じものを多数作成してメモリを無駄にしないようにします。

finalは変更不可能な値にします。これは、すべてのクラス インスタンスで同じであり、変更できない「定数」値です。

于 2015-05-28T05:52:23.850 に答える
1

通常、定数を定義するために、多くの場所で再利用して、変更の単一ポイントにしたり、単一のクラス内で使用したり、パッケージ間で共有したりします。変数finalを作成すると、偶発的な変更を回避できます。

于 2012-07-26T20:42:50.420 に答える
1

クラスで変数ではなく定数を使用するのはなぜですか?

可読性と保守性、

コードに 40.023 のような数字を使用しても、その数字が何を表しているかはあまりわかりません。そのため、「USER_AGE_YEARS」のような大文字の単語に置き換えます。後でコードを見ると、その数字が何を表しているかが明確になります。

変数だけを使用しないのはなぜですか? 数字が変わることがわかっていればそうするでしょうが、3.14159 のように変わらない数字の場合は、それを最終的なものにします。

しかし、文字列のような数値でない場合はどうなるでしょうか? その場合、主に保守性のためです。コードで文字列を複数回使用している場合 (実行時に変更されない場合)、クラスの先頭に最終的な文字列として配置すると便利です。そうすれば、変更したいときに、変更する場所がたくさんあるのではなく、1 つだけになります。

たとえば、コードに何度も出力されるエラー メッセージがある場合、final String ERROR_MESSAGE = "Something bad." となります。「問題が発生しました」から変更したい場合は、維持する方が簡単です。「遅すぎるジム、彼はすでに死んでいる」にするには、そのコメントを使用するすべての場所ではなく、その 1 行を変更するだけで済みます。

于 2016-09-17T23:26:25.960 に答える