22

これに関する参考資料はオンラインで見つかりませんでした。しかし、クラスの最後のフィールドが常にあるべきstaticか、それとも単なる慣例であるかを知りたかっただけです。それらの使用法についての私の理解に基づいて、私はそれが言語によって課される何かよりも論理的なことであると感じます。

4

8 に答える 8

40

もちろん違います。それらがクラスに属している場合は静的である必要があり、クラスのインスタンスに属している場合は静的であってはなりません。

public class ImmutablePerson {
    private static final int MAX_LAST_NAME_LENGTH = 255; // belongs to the type
    private final String firstName; // belongs to the instance
    private final String lastName; // belongs to the instance

    public ImmutablePerson(String firstName, String lastName) {
        if (lastName.length() > MAX_LAST_NAME_LENGTH) {
            throw new IllegalArgumentException("last name too large");
        }
        this.firstName = firstName;
        this.lastName = lastName;
    }

    // getters omitted for brevity
}
于 2013-02-16T18:09:30.377 に答える
25

いいえ、絶対にありません-そしてそれ慣習ではありません。

staticまったく違うものですfinal。フィールドがタイプの特定のインスタンスではなく、タイプに関連していることを意味します。これは、フィールドが初期割り当て後に値を変更できないことを意味します(タイプ/インスタンスの初期化中に発生する必要があります)。staticfinal

static finalフィールドは通常定数用ですが、インスタンスフィールドfinalは通常、不変の型を作成するときに使用されます。

于 2013-02-16T18:09:06.267 に答える
7

それらは常に一緒になるとは限らず、それは慣習ではありません。finalフィールドは、不変の型を作成するためによく使用されます。

class Person {

    private final String name;
    private final int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

}

一方staticfinalフィールドはそれほど一般的ではなく、かなり注意が必要です。アプリケーション1全体の定数static finalを意味するため、よく見られます。

1-正確には、クラスローダー全体。

于 2013-02-16T18:09:01.007 に答える
7

最終フィールドは静的である必要はなく、非静的の最終インスタンス変数があると便利な場合があります。staticとfinalの両方でマークされたフィールドは、通常、次のように定数に使用されます。

public static final int BORDER_WIDTH = 5;

ただし、オブジェクトに不変のプロパティがある場合、非静的なfinalフィールドが表示されることがあります。ただし、通常、非静的finalフィールドは通常の理由でマークさprivateれているため、コンパイラがプロパティを二度と設定しないようにするための追加のチェックになります。

于 2013-02-16T18:10:03.873 に答える
4

のようにそれらにアクセスしたい場合はClassName.FIELD、はい、そうする必要があります。静的にしない場合は、のようなことを行うnew ClassName().FIELD必要があります。これは不要であり、オブジェクトを無意味に作成します。

ただし、クラスでのみ使用する場合、または作成する場合privateは、静的にしないでください。あなたが実際のクラスにいるなら、あなたはただすることができますFIELD

この概念を完全に理解するには、その意味を知る必要がありますstatic。静的とは、インスタンスではなく、実際のクラスに属することを意味します。

于 2013-02-16T18:08:26.603 に答える
3

絶対違う。検討:

class Point {
    public final int x;
    public final int y;

    public Point(int _x, int _y) {
        x = _x;
        y = _y;
    }
}

を削除するfinalと、クラスは変更可能になります。を追加するstaticと、すべてのポイントが同じになり、コンストラクターを作成する合法的な方法はありません。

于 2013-02-16T18:11:21.630 に答える
2

絶対違う。たとえば、不変オブジェクトにはfinal、コンストラクターによって1回だけ設定できるプロパティがあります。

詳細については、http://docs.oracle.com/javase/tutorial/essential/concurrency/imstrat.htmlを参照してください。

不変オブジェクトは、finalプロパティが使用される唯一のケースではありませんが、それらの有用性の明白な例を提供します。

于 2013-02-16T18:08:47.040 に答える
0

答えはいいえだ。

静的

  • 「このクラスのすべてのインスタンスで使用できるデータフィールドは1つだけであることを示します。この修飾子がないと、各インスタンスにデータフィールドの独自のコピーがあります。」

    ...これは1つしか存在できないことを意味します

最後の

  • 「データフィールドに指定された値は変更できません」

    ...これは定数であることを意味します

于 2018-01-31T22:12:50.237 に答える