Java の new キーワードとは?初心者でもわかるオブジェクト生成のしくみ
新人
「Javaの勉強をしていると、newって毎回出てくるんですが、正直なにをしているのかよく分かりません…」
先輩
「確かに、Javaのnewキーワードは最初につまずきやすいポイントですね。クラスやオブジェクトと深く関係しています。」
新人
「クラスとオブジェクトの違いも、まだあいまいです。」
先輩
「では、クラスとは何か、オブジェクトとは何かを整理しながら、Javaのnewキーワードの役割を順番に見ていきましょう。」
1. Javaにおけるクラスとは何か
Javaにおけるクラスとは、オブジェクトを作るための設計図のような存在です。 Javaのプログラムでは、処理の単位としてクラスを定義し、そのクラスをもとに実際に動くオブジェクトを生成します。 クラスそのものは、あくまで「こういうデータを持ち、こういう動きをする」というルールをまとめたものです。
たとえば、人を表すクラスを考えると、名前や年齢といった情報を持ち、挨拶をする、年齢を表示するといった動作を定義できます。 この段階では、まだ実体は存在しておらず、あくまで設計だけが存在している状態です。
public class Person {
String name;
int age;
void greet() {
System.out.println("こんにちは");
}
}
このように、クラスはJavaプログラムの土台となる存在であり、newキーワードを理解するための重要な前提になります。
2. オブジェクトとは何か
オブジェクトとは、クラスという設計図をもとにして実際に作られた「実体」です。 クラスが設計図だとすると、オブジェクトはその設計図から作られた完成品だと考えると分かりやすいでしょう。 Javaでは、処理の多くはこのオブジェクトを通じて行われます。
同じクラスからは、複数のオブジェクトを作ることができます。 それぞれのオブジェクトは同じ構造を持っていますが、保持している値は別々になります。 この点が、クラスとオブジェクトの大きな違いです。
public class Main {
public static void main(String[] args) {
Person person1;
Person person2;
}
}
この状態では、変数は用意されていますが、まだオブジェクトは作られていません。 ここで登場するのが、Javaのnewキーワードです。
3. new キーワードとは何をするものか
Javaのnewキーワードは、クラスをもとにしてオブジェクトを生成するための命令です。 newを使うことで、Javaはメモリ上に新しいオブジェクト用の領域を確保し、その場所を参照として返します。 この参照が変数に代入されることで、プログラムからオブジェクトを操作できるようになります。
つまり、newキーワードの役割は「設計図であるクラスから、実際に使えるオブジェクトを作り出すこと」です。 Javaでオブジェクト指向プログラミングを行ううえで、newキーワードは欠かせない存在と言えます。
public class Main {
public static void main(String[] args) {
Person person1 = new Person();
person1.name = "田中";
person1.age = 20;
person1.greet();
}
}
このコードでは、new Person()によってPersonクラスのオブジェクトが生成されています。 その結果、person1という変数を通して、名前や年齢を設定したり、メソッドを呼び出したりできるようになります。
Java初心者のうちは、「なぜ毎回newが必要なのか」と疑問に思うかもしれませんが、 newはオブジェクトを新しく作るための合図であり、Javaのクラスとオブジェクトの関係を理解するうえで非常に重要なキーワードです。 Javaのnewキーワード、Javaのオブジェクト生成、Javaのクラスとオブジェクトの仕組みを意識しながら学習を進めることで、 Javaの理解は確実に深まっていきます。
4. new キーワードを使ったオブジェクト生成の基本構文
Javaでオブジェクトを生成するときの基本構文は、とてもシンプルです。 クラス名の後ろにnewキーワードを付けて呼び出すことで、そのクラスのオブジェクトが作られます。 この書き方は、Javaの学習を始めた直後から何度も目にするため、しっかり意味を理解しておくことが大切です。
基本的な形としては、「クラス型 変数名 = new クラス名();」となります。 この1行の中には、オブジェクト生成に関する重要な処理がすべて詰まっています。 Javaのnewキーワードは、単なる記号ではなく、プログラムの中で実体を生み出す合図のような役割を持っています。
Person person = new Person();
このコードでは、Personクラスをもとにして、新しいオブジェクトが生成されています。 左側のpersonは、オブジェクトそのものではなく、オブジェクトの場所を指し示すための参照です。 Javaでは、この参照を通してオブジェクトの中身にアクセスします。
日常生活にたとえると、クラスは家の設計図で、newキーワードは実際に家を建てる行為、 そして変数はその家の住所を書いたメモのようなものです。 住所のメモがなければ、どこに家があるのか分からず、家を使うこともできません。
5. new を使ったときに内部で何が起きているのか
Javaでnewキーワードを使うと、見た目以上に多くの処理が内部で行われています。 初心者のうちは意識しなくても動きますが、仕組みを理解すると、エラーや挙動の理由が分かりやすくなります。 特に重要なのが、メモリの使われ方です。
Javaでは、オブジェクトはヒープメモリと呼ばれる領域に作られます。 ヒープメモリとは、プログラムの実行中に自由に使われるメモリ領域で、 newキーワードを使うたびに、この領域に新しいオブジェクト用のスペースが確保されます。
newを実行すると、まずヒープメモリにオブジェクトの本体が作られ、 その場所を示す参照が変数に代入されます。 そのため、変数自体は軽い情報しか持っておらず、実際のデータは別の場所に存在しています。
Person person = new Person();
person.name = "佐藤";
person.age = 30;
この場合、nameやageといったデータはヒープメモリ上のオブジェクトに保存され、 personという変数は、そのオブジェクトを指し示す役割を担っています。 Javaのインスタンスとは、このようにnewによって生成されたオブジェクトのことを指します。
ヒープメモリは、使われなくなったオブジェクトを自動的に片付ける仕組みも備えています。 これにより、Javaではメモリ管理を意識しすぎなくても、安全にプログラムを書くことができます。
6. 複数のオブジェクトを生成した場合の動きの違い
Javaでは、同じクラスから複数のオブジェクトを生成することができます。 newキーワードを使うたびに、まったく別のオブジェクトがヒープメモリ上に作られます。 そのため、見た目が同じクラスであっても、内部では別々の存在として扱われます。
これは初心者が混乱しやすいポイントのひとつです。 同じクラスを使っているのに、なぜ片方を変更してももう片方に影響しないのか、 その理由は、newによって別々のオブジェクトが作られているからです。
Person person1 = new Person();
Person person2 = new Person();
person1.name = "山田";
person2.name = "鈴木";
このコードでは、person1とperson2は、それぞれ異なるオブジェクトを指しています。 どちらもPersonクラスから作られていますが、名前の情報は完全に別々に管理されています。 Javaのnewキーワードは、使うたびに新しい実体を生み出しているのです。
たとえ話としては、同じ設計図で建てた家が二軒あるようなものです。 間取りは同じでも、家具の配置や住んでいる人は異なります。 Javaのオブジェクトも同様に、構造は同じでも中身は独立しています。
Javaのオブジェクト生成、newキーワードの使い方、インスタンスの考え方を正しく理解することで、 プログラムの動きがより明確になり、バグや混乱を防ぐことができます。 特に複数オブジェクトを扱う場面では、この仕組みの理解が欠かせません。
7. コンストラクタと new キーワードの関係
Javaのnewキーワードを理解するうえで、必ず一緒に知っておきたいのがコンストラクタの存在です。 コンストラクタとは、オブジェクトが生成されるときに自動的に呼び出される特別な処理のことを指します。 newキーワードは、単にオブジェクトを作るだけでなく、このコンストラクタを実行する役割も担っています。
クラスを定義するとき、コンストラクタを自分で書かなくても、Javaは自動的にデフォルトのコンストラクタを用意します。 そのため、初心者のうちはコンストラクタの存在を意識せずにnewを使っていることが多いです。 しかし、実際にはnewが実行されるたびに、必ずコンストラクタが呼び出されています。
public class Person {
String name;
int age;
Person() {
name = "未設定";
age = 0;
}
}
このようにコンストラクタを定義すると、new Person()が実行された瞬間に、この処理が動きます。 その結果、オブジェクトが作られた直後から、nameやageには初期値が設定された状態になります。 Javaのnewキーワードとコンストラクタは、常にセットで動いていると考えると理解しやすくなります。
日常的なたとえで言えば、newキーワードは工場に製品の製造を依頼する指示であり、 コンストラクタは製品を完成させるための最初の組み立て工程のようなものです。 Javaのオブジェクト生成の仕組みを理解するうえで、非常に重要なポイントです。
8. new を使わない場合との違い
Java初心者が特に混乱しやすいのが、newを使わない代入との違いです。 一見すると同じように見えるコードでも、newがあるかどうかで、プログラムの動きは大きく変わります。 ここを正しく理解しないと、「なぜ片方を変更するともう片方も変わるのか」という疑問が生まれます。
Person person1 = new Person();
Person person2 = person1;
このコードでは、newキーワードは最初の一度しか使われていません。 person2には、新しいオブジェクトが作られているわけではなく、person1と同じ参照が代入されています。 そのため、person1とperson2は、同じオブジェクトを指し示す状態になります。
person1.name = "高橋";
System.out.println(person2.name);
高橋
この結果から分かるように、newを使わずに代入した場合は、オブジェクトが共有されます。 Javaでは、変数そのものにオブジェクトが入っているのではなく、参照が入っているため、 参照のコピーが行われると、同じ実体を操作することになります。
これに対して、newキーワードを使った場合は、必ず新しいオブジェクトが作られます。 Javaのnewキーワードの使い方を正しく理解することは、 Javaのオブジェクトの仕組みを理解することとほぼ同義と言えるでしょう。
9. 初心者が new キーワードでよく混乱するポイント
Javaのnewキーワードはシンプルに見えますが、初心者が混乱しやすいポイントがいくつか存在します。 その多くは、「オブジェクト」と「参照」を同じものとして考えてしまうことが原因です。 この違いを意識できるようになると、エラーや不具合の理由が見えてきます。
よくある混乱のひとつが、nullに対してメソッドを呼び出してしまうケースです。 変数は宣言されていても、newが実行されていない場合、参照は何も指していません。 その状態でオブジェクトを使おうとすると、実行時エラーが発生します。
Person person;
person.greet();
このコードでは、personにnewが使われていないため、オブジェクトは存在していません。 その結果、Javaはどこに処理を送ればよいか分からず、エラーを発生させます。 このようなエラーは、newキーワードの役割を正しく理解していれば防ぐことができます。
また、「同じ値を代入したのに別物になる」「別の変数なのに同じ動きをする」といった疑問も、 newを使ったかどうかを確認することで、多くの場合は解決します。 Javaのnewキーワード、Javaのコンストラクタ、Javaのオブジェクト生成の仕組みをセットで理解することが、 初心者が次のステップへ進むための大きな土台になります。