Javaにおけるnew演算子は、新しいオブジェクトのインスタンスを作成するために使用されます。オブジェクトの作成プロセスには、メモリの割り当て、フィールドの初期化、コンストラクタの呼び出しが含まれます。
従来のプログラミング言語では、メモリの割り当てとオブジェクトの初期化は別々に行われることがありました。しかし、Javaではこれらが統合され、仮想マシン(JVM)によって制御されるため、エラーやメモリリークの発生が減少します。
オブジェクトの作成時に発生するプロセスを理解していないと、不適切な初期化、メモリリーク、または予期しない挙動が発生する可能性があります。
new演算子を使用する際は:
コード例:
Person p = new Person("Ivan", 20);
これにより、メモリに独立したPersonオブジェクトが作成され、使用可能になります。
重要な特徴:
newの呼び出しは別々のオブジェクトを作成します(シングルトンパターンを除く)。オブジェクトを作成する際にnew演算子を使用せずに済む方法はありますか?
はい。たとえば、クローン(clone())、デシリアライズ、リフレクション(Class.newInstance())を使用することができますが、それぞれには独自のニュアンスと制限があります。
newは文字列プールに新しいオブジェクトを作成しますか?
いいえ。文字列をnew String("abc")のように作成すると、新しいオブジェクトがヒープに作成されますが、文字列プールに同じ文字列が既に存在していてもです。文字列にはリテラルを使用する方が良いでしょう。
newの動作は配列の場合に異なりますか?
はい。配列の場合、new演算子は配列のすべての要素のためにメモリを割り当て、デフォルト値で初期化しますが、プリミティブでない限り、要素のコンストラクタは呼び出されません。
String[] arr = new String[5]; // すべての要素はnullになります
開発者は次のように書きます:
String s1 = new String("hi"); String s2 = new String("hi"); System.out.println(s1 == s2); // false
利点:
欠点:
開発者は次のように書きます:
String s1 = "hi"; String s2 = "hi"; System.out.println(s1 == s2); // true
利点:
欠点: