A--C の答えは誤解を招くと思います。他の人が指摘したように、彼は2つの非常に異なるものである静的と最終を混在させています。大まかに言えば私見ではありませんが、特に基本的な概念を説明する場合は、十分に正確ではありません。
静的変数は、オブジェクトではなく、クラスに関連付けられています。クラスのすべてのインスタンスは、メモリ内の 1 つの固定位置にあるクラス変数を共有します。どのオブジェクトでもクラス変数の値を変更できますが、クラスのインスタンスを作成せずにクラス変数を操作することもできます。
反対側の最終変数は、一度だけ初期化できる変数です。それらの値は、コンパイル時に知る必要はありませんが、実行時に設定できます。final 変数がインスタンス変数の場合、この変数には多くのインスタンスが存在する可能性があり、すべて異なる値を持ちます。
static final 変数は 1 つしかなく、一度初期化されると実行時に変更できないため、定数です。Java では、少なくともコンパイル時に値を知る必要はありません。
これはすべて非常に理論的なものなので、これらのタイプの変数の使用法を示す例を作成しましょう。
public class Circle implements Serializable {
private static final long serialVersionUID = -1990742486979833728L;
private static int sNrOfCircles;
private final double mArea;
public Circle(double radius) {
sNrOfCircles++;
mArea = radius*radius*Math.PI;
}
}
serialVersionUID は、逆シリアル化中に使用される Circle クラスにバージョン番号を関連付けて、送信側と受信側がシリアル化に関して互換性のあるそのオブジェクトのクラスをロードしたことを確認します。serialVersionUID は変更されず、Circle のすべてのインスタンスで同じです。
sNrOfCircles は、Circle インスタンスの数をカウントします。Circle の新しいインスタンスごとに変更されます (serialVersionUID は変更されません)。
mArea は円の面積を定義します。また、Circle のすべてのインスタンスで変更されますが、sNrOfCircles と比較すると、Circle クラスではなく Circle オブジェクトに関連付けられており、別の Circle オブジェクトが作成されると sNrOfCircles が変更される間は変更できません。
簡単に言うと、Class 属性の場合は static を使用し (円はいくつありますか?)、初期化後に値が変更されない場合は final を使用し (指定された半径の円の領域)、それが変更されない場合は static final を使用します。両方。