38

Java定数が静的に宣言されているのはなぜですか?

class Foo{
    static final int FII = 2 ;
}

これで私はfinalの使用を理解していますか?なぜ静的でなければならないのですか?インスタンス変数ではなく、クラス変数である必要があるのはなぜですか?

4

4 に答える 4

111

定数が静的でない場合、Javaはクラスのすべてのオブジェクトでその定数にメモリを割り当てます(つまり、オブジェクトごとに定数の1つのコピー)。

定数が静的である場合、そのクラスの定数のコピーは1つだけになります(つまり、クラスごとに1つのコピー)。

したがって、定数の値が1つしかない場合は、静的と宣言する必要があります。

オブジェクトの作成時間など、定数の値がオブジェクトごとに異なる可能性がある場合は、静的と宣言しないでください。

于 2011-11-11T11:32:24.623 に答える
42

クラスのインスタンスによって異なる可能性がある場合、それは明らかに定数ではありません。のインスタンスごとに異なるpiの値を取得することはどういう意味ですかMathMathインスタンスを構築することさえできません)?Stringまたは、 ?のインスタンスごとに大文字と小文字を区別しない順序付けを変更します。

于 2011-11-11T11:22:30.680 に答える
13

それは単に、そのクラスのインスタンスなしでそれらにアクセスできるようにするためです。

定数フィールドにアクセスするためだけにインスタンスを作成する必要があるのは、リソースの浪費です。

于 2011-11-11T11:22:04.717 に答える
2

Java定数が静的に宣言されているのはなぜですか?

技術的にはそうではありませんが、JLSは定数を最終的な定数式として定義しています(Javaでは正式には参照されていませんcompile time constant expression)。定数式で初期化されるfinalと宣言された変数を意味し、静的なしを意味します-https://docs.oracle.com/javase/specs/jls/se8/html/jls-4.html#jls-4.12.4

定数変数は、定数式で初期化されるプリミティブ型または型Stringの最終変数です。

ただし、この仕様では、Javaのすべてである定数型、クラス、およびオブジェクトについては何も扱われていません。したがって、Mathの例に関するJon Skeetの回答には一部が欠けています。コンストラクターをプライベートにすることでインスタンス化できないため、Mathクラスは定数と見なされます。

http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/687fd7c7986d/src/share/classes/java/lang/Math.java- _

public final class Math {


    /**

     * Don't let anyone instantiate this class.

     */

    private Math() {}

    public static final double PI = 3.14159265358979323846;

}

タイプ自体が一定であることをサポートするには、その状態も一定であることを確認する必要がありますが、可変であり、タイプの外部からの変更にさらされているメンバーに対してのみです。

たとえば、文字通りのPIは公開されるため、型の外部から利用できます。したがって、外部から変更されないようにするために、最終的になり、静的になります。これにより、Class Class <Math>インスタンスの一部になり、クラスが(明示的に)インスタンス化されることなく、Mathの外部で使用できるようになります。

于 2020-07-03T15:42:25.037 に答える