0

この単純なクラスがあるとします:

public class Car {
  public static final int TYPE_SUV = 1;
  public static final int TYPE_TRUCK = 2;
  public String name;
  public int carType;
}

これらのコレクションがある場合、コレクション内の各要素に aStringと anを割り当てていることはわかっていますが、 static も複数回int格納していますか? intこの不自然なサンプル クラスは、このようなマジック ナンバーは、別のクラスで定義された を使用したほうがよいということを知る前に、何年も前に私が書いた種類の Java を代表していenumますが、このコードの副作用が何であるかを常に疑問に思っていました。 .

4

4 に答える 4

5

1.7 JLSから:

フィールドが静的であると宣言されている場合、クラスのインスタンスが最終的にいくつ (場合によってはゼロ) 作成されても、フィールドの具体化は 1 つだけ存在します。クラス変数と呼ばれることもある static フィールドは、クラスが初期化されるときに具体化されます (§12.4)。

静的と宣言されていないフィールド (非静的フィールドと呼ばれることもあります) は、インスタンス変数と呼ばれます。クラスの新しいインスタンスが作成されるたびに (§12.5)、そのインスタンスに関連付けられた新しい変数が、そのクラスまたはそのスーパークラスで宣言されたすべてのインスタンス変数に対して作成されます。

注意すべき重要な点は、インスタンスの数 (1、1000、またはなし) に関係なく、メモリは (インスタンスではなく) クラスごとに消費されるということです。

価値があるのは、インスタンス変数namecarTypeインスタンス変数が割り当てられるのは、インスタンスが作成されたときだけです。さらに、Java 7 より前Stringでは、等しい値の s をインターンすることができました。これは、使用される場所で参照される単一の String インスタンスに維持され、String で管理されたメモリ (PermGen 内) に格納されます。これは、メインヒープに移動したときにJava 1.7で変更され、 Java 8で再び変更されているようです(?)

于 2013-02-20T16:38:31.610 に答える
3

static変数はオブジェクトではなくクラスに関連付けられています。したがって、Object作成したstatic変数は一度メモリ内に配置されStatic context、クラスのロード時にすべてのロードが行われるため、作成しなくても、名前を使用して変数にObjectアクセスできます。staticclass

于 2013-02-20T16:13:46.047 に答える
3

コピーはどこにも保存されず、メモリ内の同じ場所 (ヒープ上) への複数の参照が作成されます。

于 2013-02-20T16:13:05.910 に答える
1

の複数のコピーstaticは維持されません。すべてobjectssame static変数があります。彼らがそれを持っているなら、あなたは彼らにそれをしなければなりませaccessusing objectが、これは私たちがしていることではありませんstatic.

参照を保存することのペナルティ = クラスを作成することのペナルティ。

于 2013-02-20T16:15:15.050 に答える