Java の初期化に興味があります: 次
のようなオブジェクトを初期化する必要があるのはいつですか:
String init = new String("");
また、文字列など、上記のように初期化する必要がないオブジェクトはどれですか?
String init = "";
Java の初期化に興味があります: 次
のようなオブジェクトを初期化する必要があるのはいつですか:
String init = new String("");
また、文字列など、上記のように初期化する必要がないオブジェクトはどれですか?
String init = "";
あなたの質問に対するあなたのコメントから:
それから私の質問は、「new Object()」の初期化が必要なオブジェクトはどれですか?
初期化ではなく、構築について質問しています。
すべてのオブジェクトは誰かが構築する必要があります。文字列リテラルによって作成された文字列は、JVM によって構築されます。あなたは基本的に決して使いたくありませんnew String("text content here")
。
Class
ロードする各クラスのオブジェクトなど、JVM によって構築されるその他のオブジェクトがいくつかあります。しかし、 以外String
に、対話したいオブジェクトについては、通常、( を介してnew
) 明示的にそれらを構築するか、それらを構築するメソッドからそれらを受け取る必要があります。は、リテラル表記を持つJava で唯一のオブジェクト型 (だと思いますString
) であるため、少し特殊です。(またはのような他のすべてのリテラルはプリミティブです。)42
false
基本的に、あなたが言及した初期化の2つの方法には微妙な違いがあります:
String str = new String("");
新しいString
オブジェクトがヒープ上に作成され、それをstr
指します。
しかし、後者の場合:
String str = "";
この値 ("") を持つ文字列が文字列プールに既に存在する場合、参照はそれを指すように初期化され、新しいオブジェクトは作成されません。文字列プールに見つからない場合は、新しい文字列が文字列プールに作成され、str
それを指すように初期化されます。
文字列の場合、ほとんどの場合、2 番目の形式を使用します。ほとんどの場合、結果は同じです。
Integer
、などの数値クラスにも同じアドバイスが当てはまりますDouble
。
それ以外の場合は、通常は選択肢がなく、最初の形式を使用する必要があります。
Java では、すべてのオブジェクトを初期化する必要があります。2 番目のケースinit = ""
も初期化です。ただし、コンパイラが明示的な呼び出しを回避できることを除けば、オブジェクトの作成は引き続き行われます。Java 5 以降、コンパイラは Java プリミティブのラッパーについても「認識」しており、ラッパー クラスを必要とする式でプリミティブ定数を使用できます (これはautoboxingと呼ばれます)。
すべてのローカル変数は明示的に初期化する必要がありますが、メンバー フィールドは暗黙的に、null
またはプリミティブの既定値に初期化できます。
すべてのオブジェクトを初期化する必要がありますnew
が、次のようなものがあります。
String myString= "";
Integer myInteger= 2;
Float myFloat= 2f;
Double myDouble= 2d;
Byte myByte = 2;
`T[] array = {//list some Ts}; のように初期化できるあらゆる種類の配列。
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};
ほとんどのクラスは明示的な構築 (新しい) を必要としますが、いくつかのクラスは必要ありません。これらはオートボクシング クラス (String、Integer、Double など、およびこれらの配列 (カンマ区切りリストの初期化を使用)) です。これらは唯一のものです!
コンパイラレベルで実際に起こることは、コンパイラが暗黙の構造を明示的な構造に変換することです (たとえば、new を使用するもの)。
すべてのオブジェクトは、使用する前に初期化する必要があります。次のように宣言してみてください。
int myPrimitiveInt;
Integer myObjectInt;
ただし、値を指定するまで myPrimitiveInt を使用することはできず、myObjectInt は暗黙的に null として初期化されます。これらのいずれかを使用するには (オブジェクトから null を取得する場合を除く)、コンストラクターを使用するかどうかにかかわらず、値を指定する必要があります。
myPrimitiveInt = 5;
myObjectInt = new Integer(5);
myObjectInt = 5;