これを明確にしたいと思います。違いは何ですか -
private static int STUDENT_AGE = 18;
そして
private static final int STUDENT_AGE = 18;
フィールド内?
Jon Skeetは、「特定のインスタンスとはまったく関係がない」と説明しました。わかりました。では、この場合、finalは正確に何をしますか?
以下のコードは機能しません。学生の年齢が静的ファイナルとして割り当てられているためですか?デフォルトの年齢はまったく上書きできないということですか?次に、デフォルト以外の年齢を指定するコンストラクターを作成することは可能ですか?
private String myName;
private String myAddress;
private int myYearEnrolled;
private String myGender;
private static final int STUDENT_AGE = 18;
public Student(String name, String address, int year, String gender) {
myName = name;
myAddress = address;
myYearEnrolled = year;
myGender = gender;
}
public Student(int age)
{
STUDENT_AGE = age;
}
変数がfinal
と宣言されると、その値を後で変更することはできません。提供したコードサンプルでは、特定のアクティビティの学生の年齢を定義するための定数が宣言されています。特定の活動について、学生の年齢がこの定数と比較される条件があることを意味する場合があります。学生の年齢が18歳を超える場合、続行できるかどうかは彼だけに許可されます。
static
は、「特定のインスタンスにまったく関係がない」ことを意味します-final
は、初期化後にこの値を変更できず、この値を初期化する必要があることを意味します。
final
とstatic
の組み合わせにより、定数を作成することができます。これはタイプセーフではないため、パブリックな方法では推奨されなくなりました(たとえば、プライベートコンテキストのマジックナンバーではまったく問題ありません)。 Joshua Blochs Effective Javaおよび this の質問で提案されているように、Enum
post Java 1.5を使用するか、Java 1.5より前に独自のタイプセーフ列挙型を作成します。
備考:これを約1年後に読んで、一般にpublic static final
フィールドに問題はないことを強調する必要があると思います。名前付き定数は、enums
または別のもので実装する必要があります。安全な代替を入力してください。
private static final int STUDENT_AGE = 18;
それは一定の宣言です。値を変更することはできません。
private static int STUDENT_AGE = 18;
これは静的な宣言ですが、一定ではありません。値は変更できます。
簡単に言うと、修飾子finalはそのFINALを意味します。一度定義した値を変更することはできません。
そして、要件に来て、何も提供されていない場合にデフォルトの年齢を提供したい場合は、変数STUDENT_AGEの最終修飾子を削除するだけです。 @Quoiが言ったこと
final
変数は一度だけ初期化できます。
フィールドのfinal
修飾子は、フィールドの値cannotが初期化されると変更されることを示します。
このため、非ファイナルでない限り、STUDENT_AGE = age;
を設定することはできません。
final static
変数は一度だけ初期化できますが、必ずしも宣言時に初期化できるとは限りません。ただし、一度初期化すると、値を変更することはできません。したがって、final static
変数はで初期化できます。宣言時または静的ブロック内。
private static final int STUDENT_AGE = 20;
または
private static final int STUDENT_AGE;
static {
STUDENT_AGE = 20;
}
現在、static
変数(class
変数とも呼ばれます)は、どのインスタンスにも固有ではありません。そのクラスのすべてのインスタンス間で共有されます。
このように、クラスが最初にロードされるときにStatic
変数がメモリにロードされます。これが、すべてのインスタンスで共有される理由です。したがって、インスタンスによる静的変数の変更は、そのクラスの他のすべてのインスタンスに反映されます(はい、その権利を読みます。クラスのインスタンス変数を介してstatic
変数にアクセスすることもできます。しかしコンパイラは最終的には実際のクラスのみを心配します)