2

フィールドは存在する限りオブジェクトに固定されるため、メモリが割り当てられていることは知っていますが、一部のフィールドを初期化せずに使用しない場合はどうなりますか?例えば:

public class TEST {
   public static void main(String[] args) {
      Foo C = new Foo(5, 7);
      Foo D = new Foo(5);
      ...
}

public class Foo{
   private int A;
   private float B;

   public Foo (int A, float B){
      this.A = A;
      this.B = B;
    }
    public Foo (int A){
        this.A = A;
    }
    ...
}

Cより多くのメモリを消費しますDか?

4

4 に答える 4

7

Javaのフィールドは常に初期化されます。プリミティブは0またはfalseに初期化され、参照(および配列)はに初期化されnullます。

さらに、フィールドを宣言すると、そのフィールドはすべてのインスタンスで常に同じスペースを占有します。参照はポインタと同じくらいのスペースしか占有しませんが、参照されるオブジェクトは余分なメモリを消費する可能性があります。

于 2013-02-16T17:55:13.307 に答える
1

コンストラクター内でフィールドを初期化しないという事実は、それらが初期化されていないことを意味するわけではありません。

演算子を使用してクラスのインスタンスを作成するnewと、オブジェクトが作成され、新しく作成されたインスタンスと、そのクラスのすべてのインスタンスフィールドとそのすべてのスーパークラスにメモリが割り当てられ、デフォルト値で初期化されます。

これはすべて、コンストラクターが呼び出される前に発生します。したがって、この場合は両方ともCD同じメモリが割り当てられます。

ここで、フィールドがプリミティブではなく、他のインスタンスへの参照である場合を考えてみましょう(ではIntegerなくSay int)。その場合、のデフォルト値はIntegerですnullCまた、ではなく1つの参照用に初期化するとDC参照にはより多くのメモリが含まれます(参照フィールド用に作成されたインスタンスの追加メモリがそこにあります)。

于 2013-02-16T17:49:34.643 に答える
1

まず、スタイルについてのささいなコメント。コードは私にはJavaに見えます。したがって、すべての変数は小文字にする必要があります。次に、あなたの質問に対して、あなたの例では、オブジェクトCとDは同じ量のメモリを消費します。

フィールドはプリミティブ型であり、ヒープ上の1つのFooオブジェクトはintに4バイト、floatにさらに4バイトかかります。それらを初期化しない場合でも、それらはデフォルト値(コンパイラーによって設定された)を取ります。

もう少し深くドリルするために、Fooオブジェクトは32ビットJVMで正確に16バイトを消費します。

ヘッダー(オブジェクトID、クラスオブジェクトへの参照、ロックなど)用に8バイト、フィールド(intおよびfloat)用に8バイト。

詳細については、この素敵な記事を参照してください。

于 2013-02-16T18:11:16.147 に答える
0

メモリのみnewを割り当てます。Sizeof(Foo)は、プリミティブ型のみで構成されているため、一定です。

Fooにobject型の属性を追加すると、それらを割り当てるかどうかに関係なく、消費されるサイズが変化します。

public class Foo{
   private int A;
   private float B;
   private Date  C;

   public Foo (int A, float B){
      this.A = A;
      this.B = B;
      this.C = new Date();
    }
    public Foo (int A){
        this.A = A;
    }
    ...
}

public class TEST {
   public static void main(String[] args) {
      Foo C = new Foo(5, 7);
      Foo D = new Foo(5);
      ...
   }
}

この場合、DはCよりも少ないメモリを消費します。

于 2013-02-16T17:49:06.993 に答える