これから学ぶこと
Javaのプログラミング学習を始めると、多くの人が最初に「クラス」と「オブジェクト」という言葉の壁にぶつかります。「なんだか難しそう…」と感じるかもしれませんが、心配はいりません。この記事では、この二つの関係を身近な例えで解きほぐし、Javaプログラミングの最も基本的で重要な考え方を誰にでも分かるように解説します。この記事を読み終える頃には、Javaの世界の第一歩をしっかりと踏み出せているはずです。
すべては「設計図」から始まる:クラスとオブジェクトの最も重要な関係
Javaにおける「クラス」と「オブジェクト」の関係を理解する最も簡単な方法は、「設計図」と「そこから作られた実物」の関係をイメージすることです。
例えば、自動車を作るとき、いきなり作り始める人はいません。まず、どんな性能で、どんな部品が必要で、どんな形をしているかという詳細な「設計図」を用意します。この 設計図にあたるのが「クラス」 です。
そして、その設計図を基に、工場で実際に組み立てられた自動車、つまり、あなたが実際に乗ったり、操作したりできる 実物にあたるのが「オブジェクト」 です。
この関係を整理すると、以下のようになります。
| クラス (Class) - 設計図 | オブジェクト (Object) - 実物 |
|---|---|
| モノの定義やテンプレートです。 | 設計図(クラス)を基に作られた実体です。 |
| そのモノがどんな情報を持つか(属性)を決めます。 | 設計図で決められた情報を実際に保持します。 |
| そのモノがどんな操作ができるか(振る舞い)を決めます。 | 設計図で決められた操作を実際に実行できます。 |
| これだけでは実体がなく、直接操作することはできません。 | メモリ上に存在し、プログラムで直接操作することが可能です。 |
この「設計図」と「実物」の関係が分かったところで、実際にJavaのコードで「クルマの設計図」をどのように書くか見ていきましょう。
Javaで設計図を書いてみよう:Carクラスの作成
Javaでクラス(設計図)を作るとき、主に2つの要素を定義します。
- 属性(フィールド):そのモノが持つ「情報」や「状態」です。クルマで言えば、「メーカー名」「モデル名」「製造年」などがこれにあたります。
- 操作(メソッド):そのモノができる「振る舞い」や「動作」です。クルマで言えば、「エンジンをかける」「情報を表示する」といった操作です。
それでは、ソースコードでCarクラスという設計図を見てみましょう。
- 属性(フィールド)
- String make; (メーカー名)
- String model; (モデル名)
- int year; (製造年)
- 操作(メソッド)
- startEngine() (エンジンをかける動作)
- displayInfo() (クルマの情報を表示する動作)
// クルマの設計図となるCarクラス
public class Car {
// 属性(フィールド):クルマが持つ情報
String make; // メーカー
String model; // モデル
int year; // 年式
// 操作(メソッド):クルマができる振る舞い
// エンジンを始動するメソッド
public void startEngine() {
System.out.println("エンジンが始動しました。");
}
// 車両情報を表示するメソッド
public void displayInfo() {
System.out.println("メーカー: " + make);
System.out.println("モデル: " + model);
System.out.println("年式: " + year);
}
}
設計図が完成しました。次はいよいよ、この設計図から本物のクルマを作り出してみます。
設計図を本物のクルマに!:オブジェクトの生成(インスタンス化)
設計図(クラス)から実物(オブジェクト)を作り出す作業のことを、専門用語で「インスタンス化」と呼びます。難しく聞こえますが、やっていることは「設計図から実物を組み立てる」ことと全く同じです。
Javaでインスタンス化を行うには、newという「魔法の言葉」を使います。
// Carクラス(設計図)から、myCarという名前のオブジェクト(実物)を生成
Car myCar = new Car();
この一行だけで、メモリの中にCarクラスの設計通りの実物が1つ作られ、myCarという名前で操作できるようになりました。
ただし、今の時点ではmyCarは空っぽの状態です。メーカー名などの情報を設定してあげましょう。
// 作成したmyCarオブジェクトの属性(情報)を設定します
myCar.make = "Toyota";
myCar.model = "Corolla";
myCar.year = 2023;
これでmyCarはただの設計図ではなく、具体的な情報を持った、実際に動かせる「クルマ」になりました。さっそく、設計図に書かれていた「情報を表示する」という操作(メソッド)を実行してみましょう。
// myCarオブジェクトの情報を表示する
myCar.displayInfo();
/* 実行結果:
メーカー: Toyota
モデル: Corolla
年式: 2023
*/
ちゃんと設定した情報が表示されましたね。
これで1台のクルマが作れました。しかし、オブジェクトを作るたびに手動で情報を設定するのは少し手間がかかります。もっと効率よく、オブジェクト作成と同時に初期設定を完了させる方法を見ていきましょう。
もっと詳しく見てみよう:Catクラスとコンストラクタの役割
先ほどのCarクラスでは、newでオブジェクトを作った後、myCar.make = ...のように、一行ずつ手動で情報を設定していきました。これでも動きますが、オブジェクトを作るたびに同じような設定コードを書くのは少し面倒ですし、設定し忘れるかもしれません。オブジェクトが生まれる瞬間に、名前のような必須の初期設定をまとめて済ませてしまう、もっとエレガントな方法はないのでしょうか?
その答えが「コンストラクタ」です。
コンストラクタとは、「オブジェクトが生まれる(インスタンス化される)瞬間に、一度だけ自動的に実行される、特別な初期設定用のメソッド」のことです。
Catクラスの例を見てみましょう。
public class Cat {
// 属性(フィールド)
String name;
// コンストラクタ:オブジェクトが作られるときに名前を設定する
public Cat(String name) {
// this.nameは「このオブジェクト自身のname」という意味
// 引数で受け取ったnameを、このオブジェクトのnameに設定する
this.name = name;
}
// 操作(メソッド)
public void meow() {
System.out.println(name + " says: Meow!");
}
}
注目すべきはpublic Cat(String name)の部分です。これがコンストラクタです。 this.name = name;という行は、「このオブジェクト自身のnameフィールドに、引数として受け取ったnameの値を設定しなさい」という意味です。(thisは「このオブジェクト自身」を指すキーワードだと覚えておきましょう)
この設計図を使えば、名前の違うネコを簡単に作り出すことができます。
// "Mittens"という名前でCatオブジェクトを生成
Cat mittens = new Cat("Mittens");
// "Whiskers"という名前でCatオブジェクトを生成
Cat whiskers = new Cat("Whiskers");
new Cat("Mittens")と書くことで、コンストラクタが呼ばれ、mittensオブジェクトの名前は最初から "Mittens" に設定されます。whiskersも同様です。
重要なのは、mittensとwhiskersは同じCatクラス(設計図)から作られましたが、それぞれが異なる名前(データ)を持つ、完全に独立した実物(オブジェクト)であるという点です。
実際にそれぞれのネコに鳴いてもらうと、結果が異なることが分かります。
// mittensオブジェクトに鳴いてもらう
mittens.meow();
// 実行結果: Mittens says: Meow!
// whiskersオブジェクトに鳴いてもらう
whiskers.meow();
// 実行結果: Whiskers says: Meow!
このように、オブジェクトごとに状態が違うことが明確に示されました。
まとめ:これだけは覚えておこう!
この記事で学んだ、Javaプログラミングにおける最も重要な3つのポイントを振り返りましょう。
- クラスは「設計図」:モノの属性(情報)とメソッド(振る舞い)を定義するテンプレートです。
- オブジェクトは「実物」:クラスという設計図を基にnewキーワードを使って作られた、実際にプログラムで操作できるモノです。このプロセスを「インスタンス化」と呼びます。
- オブジェクトはそれぞれ独立している:同じクラスから作られたオブジェクトでも、それぞれが異なる情報(状態)を持つことができます。
「クラス」と「オブジェクト」の概念は、Javaをはじめとする多くのプログラミング言語で採用されている「オブジェクト指向プログラミング」という考え方の根幹をなすものです。この関係をしっかり理解することが、より複雑で面白いプログラムを作るための、大切で力強い第一歩となります。