1

Java の初期化に興味があります: 次
のようなオブジェクトを初期化する必要があるのはいつですか:

String init = new String("");

また、文字列など、上記のように初期化する必要がないオブジェクトはどれですか?

String init = "";
4

8 に答える 8

3

あなたの質問に対するあなたのコメントから:

それから私の質問は、「new Object()」の初期化が必要なオブジェクトはどれですか?

初期化ではなく、構築について質問しています。

すべてのオブジェクトは誰かが構築する必要があります。文字列リテラルによって作成された文字列は、JVM によって構築されます。あなたは基本的に決して使いたくありませんnew String("text content here")

Classロードする各クラスのオブジェクトなど、JVM によって構築されるその他のオブジェクトがいくつかあります。しかし、 以外Stringに、対話したいオブジェクトについては、通常、( を介してnew) 明示的にそれらを構築するか、それらを構築するメソッドからそれらを受け取る必要があります。は、リテラル表記を持つJava で唯一のオブジェクト型 (だと思いますString) であるため、少し特殊です。(またはのような他のすべてのリテラルはプリミティブです。)42false

于 2013-03-29T10:36:32.467 に答える
2

基本的に、あなたが言及した初期化の2つの方法には微妙な違いがあります:

String str = new String("");

新しいStringオブジェクトがヒープ上に作成され、それをstr指します。

しかし、後者の場合:

String str = "";

この値 ("") を持つ文字列が文字列プールに既に存在する場合、参照はそれを指すように初期化され、新しいオブジェクトは作成されません。文字列プールに見つからない場合は、新しい文字列が文字列プールに作成され、strそれを指すように初期化されます。

于 2013-03-29T10:46:23.697 に答える
1

文字列の場合、ほとんどの場合、2 番目の形式を使用します。ほとんどの場合、結果は同じです。

Integer、などの数値クラスにも同じアドバイスが当てはまりますDouble

それ以外の場合は、通常は選択肢がなく、最初の形式を使用する必要があります。

于 2013-03-29T10:36:13.693 に答える
1

Java では、すべてのオブジェクトを初期化する必要があります。2 番目のケースinit = ""も初期化です。ただし、コンパイラが明示的な呼び出しを回避できることを除けば、オブジェクトの作成は引き続き行われます。Java 5 以降、コンパイラは Java プリミティブのラッパーについても「認識」しており、ラッパー クラスを必要とする式でプリミティブ定数を使用できます (これはautoboxingと呼ばれます)。

すべてのローカル変数は明示的に初期化する必要がありますが、メンバー フィールドは暗黙的に、nullまたはプリミティブの既定値に初期化できます。

于 2013-03-29T10:37:02.730 に答える
1

すべてのオブジェクトを初期化する必要がありますnewが、次のようなものがあります。

 String myString= "";
 Integer myInteger= 2;
 Float myFloat= 2f;
 Double myDouble= 2d;
 Byte myByte = 2;

`T[] array = {//list some Ts}; のように初期化できるあらゆる種類の配列。

于 2013-03-29T10:39:16.800 に答える
1
String s1 = "1";
String s2 = new String("2");
int i1 = 1;
int i2 = new Integer(2);
long l1 = 1l;
long l2 = new Long(2l);
float f1 = 1f;
float f2 = new Float(2f);
double d1 = 1d;
double d2 = new Double(2d);
char c1 = '1';
char c2 = new Character('2');
byte b1 = 1;
byte b2 = new Byte((byte) 2);
int[] a1 = {1};
int[] a2 = new int[] {2};
于 2013-03-29T10:40:55.980 に答える
1

ほとんどのクラスは明示的な構築 (新しい) を必要としますが、いくつかのクラスは必要ありません。これらはオートボクシング クラス (String、Integer、Double など、およびこれらの配列 (カンマ区切りリストの初期化を使用)) です。これらは唯一のものです!

コンパイラレベルで実際に起こることは、コンパイラが暗黙の構造を明示的な構造に変換することです (たとえば、new を使用するもの)。

于 2013-03-29T10:41:52.367 に答える
1

すべてのオブジェクトは、使用する前に初期化する必要があります。次のように宣言してみてください。

int myPrimitiveInt;
Integer myObjectInt;

ただし、値を指定するまで myPrimitiveInt を使用することはできず、myObjectInt は暗黙的に null として初期化されます。これらのいずれかを使用するには (オブジェクトから null を取得する場合を除く)、コンストラクターを使用するかどうかにかかわらず、値を指定する必要があります。

myPrimitiveInt = 5;
myObjectInt = new Integer(5);
myObjectInt = 5;
于 2013-03-29T10:42:50.503 に答える