1

以下のコンストラクターでは、2 つの変数のみを初期化し、一部の変数を明示的に初期化しないままにしています。

私が読んだように、コンストラクターが私たちによって提供されている場合、コンパイラーによって引数コンストラクターは作成されません。そのような場合、私には独自のコンストラクターがあるため、変数 p と q を初期化するデフォルトのコンストラクターはありません。

したがって、ロジックは、これらの初期化されていない変数にアクセスしようとすると、コンパイル時エラーになるはずです.ただし、次のコードは正常に実行されます.

出力は 5 10 0.0 0.0 です

コンストラクターで宣言していないので、出力 0.0 と 0.0 をどのように説明できますか??

public class Rectangle {
int l, b;
double p, q;

public Rectangle(int x, int y) {
l = x;
b = y;
}

public static void main(String[] args) {
    Rectangle obj1= new Rectangle(5,10);
    System.out.println(obj1.l);
    System.out.println(obj1.b);
    System.out.println(obj1.p);
    System.out.println(obj1.q); 
}

}

4

5 に答える 5

4

プリミティブはデフォルト値に初期化されます。この場合、整数の場合は 0、float または double の場合は 0.0 です。オブジェクトはデフォルトで null です。たとえば、String は null になります。

通常、コンストラクターで設定する値はデフォルト値とは異なるため、コンストラクターが必要です。

デフォルトの初期値は言語機能であり、コンストラクタはまったく必要ありません。

ここでデフォルト値について読みます: http://www.janeg.ca/scjp/lang/defaults.html

ただし、デフォルト値は、ローカル変数ではなく、CLASS メンバーに対するものであることに注意してください。その違いが、一部の値が初期化されていない場合にコンパイル エラーが発生する理由です。

于 2012-05-31T09:17:24.743 に答える
0

単純なデータ型をnullにすることはできません(intやdoubleなどの型)。オブジェクトのみをnullにすることができます。これらの数値の単純なデータ型のデフォルト値は常に0です。したがって、double値を初期化しない場合、オブジェクトを使用する場合は常に0.0になり、ラッパークラスIntegerまたはDoubleを使用します。

于 2012-05-31T09:18:53.620 に答える
0

これを覚えて、

Java では、インスタンス変数はデフォルトでそれぞれのデフォルト値に初期化されます。これが、初期化されていない値が 0.0 である理由です (データ型が double であるため)。

char = \u0000

ダブル = 0.0

オブジェクト参照変数 = null;

しかし、Java では、ローカル変数 (つまり、メソッド内) を使用する前に初期化する必要があります。そして、それはプログラマーによって行われなければなりません。

于 2012-05-31T09:24:03.903 に答える
0

デフォルトでは、Java は double を 0.0 に初期化します

これは、double がヌル参照にならないプリミティブ データ型であるためです。

Java ドキュメントから:

http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

Data Type   Default Value (for fields)
 byte                  0
 short                 0 
 int                   0
 long                  0L
 float                 0.0f
 double               0.0d
 char                 '\u0000'
 String (or any object)     null
 boolean                   false
于 2012-05-31T09:16:36.977 に答える
0

ルールは、ローカル変数とその他すべてで異なります。基本的に、違いはスタック割り当てとヒープ割り当てです。スタック フレームとは異なり、ヒープに割り当てられたすべてのメモリ (およびすべてのインスタンスとクラス変数) は、コードが監視する機会を得る前にゼロに設定されます。したがって、Java は、静的分析によって、コードが初期化する前にローカル変数を読み取ることができないことを保証しますが、ヒープに割り当てられた変数についてはそのようなチェックはなく、常に一貫した値を持ちます (型によるゼロバイトの解釈に関係なく)質問 -- ゼロ番号、false ブール値、null-refs)。

于 2012-05-31T09:21:41.520 に答える