クラスとインスタンス¶
本章の目的
- オブジェクト指向における「設計」と「実体化」の基本を理解すること
- 自分で簡単なクラスを作り、複数のインスタンスで使い分けられるようになること
1. クラスとインスタンスってなに?¶
● はじめに
Javaのプログラムでは、「現実のものごとをプログラムの中で表現する」という考え方がとても重要になります。たとえば、あなたの家にある車や犬やスマートフォンなどを、プログラムの中でも登場させて動かしたいとき、どう表現すればよいでしょうか?
そこで登場するのが、クラス(class)とインスタンス(instance)という考え方です。
● クラスは「設計図」
クラスとは、「もの(オブジェクト)をプログラムで表現するための設計図」です。
たとえば、「車」を表すクラスを作るときには、
- どんな情報を持っているか?(例:速度、色、メーカー)
- どんな動きをするか?(例:走る、止まる、曲がる)
といったことを設計図としてまとめます。
クラスは「どんな性質・動きがあるのか」を定義する枠組みです。まだ実物(データ)は存在しません。
● インスタンスは「その設計図から作られた実物」
クラスという設計図をもとに、実際に動かせるものを作り出したものが「インスタンス」です。 プログラム上では、クラスからインスタンスを作って、それぞれに名前をつけて使います。
たとえば Car というクラスから、
Car myCar = new Car();
と書けば、「myCar」という車が1台できあがります。
さらに、もう1台別の車を作ることもできます:
Car yourCar = new Car();
このように、1つのクラスから複数のインスタンスを作ることができるのです。
● 現実の例で考えてみよう
- ペンというクラス:色やインクの種類、書く動作
- → インスタンス:あなたの手元にある赤いボールペン、青い万年筆など
- 犬というクラス:名前、年齢、吠える動作
- → インスタンス:ポチ、レオ、モモ など実際の犬
● なぜそんな仕組みが必要なの?
プログラムでは、「似たような機能を持つが、具体的な中身は違うもの」がたくさん出てきます。 毎回一から作るのではなく、共通の設計図(クラス)を作っておけば、後からいくつでも具体的な実体(インスタンス)を作ることができます。
● この章で学ぶこと
この章では、まず「クラスとインスタンス」という概念を理解し、実際に自分でクラスを定義し、インスタンスを作って使う方法を学んでいきます。 まずは、「設計図と実物の関係」という感覚をしっかりつかんでおきましょう。
2. クラスの基本構造を見てみよう¶
● クラスはどうやって書くの?
基本構文
Javaでクラスを定義するには、次のような基本形を使います:
public class クラス名 {
// フィールド(データ)
// メソッド(処理)
}
これは、いわば箱のようなもので、この中にデータ(変数)と動作(メソッド)を入れていく、というイメージです。
● 実例:ペン(Pen)を表すクラス
まずは、「ペン」という現実のモノを表すクラスを考えてみましょう。
public class Pen {
String color;
boolean hasCap;
public void write() {
System.out.println("書いています...");
}
}
このクラスには以下のような要素があります:
部分 | 説明 |
---|---|
String color |
ペンの色を表すデータ(文字列) |
boolean hasCap |
キャップがついているかどうかを表す真偽値 |
write() メソッド |
ペンで書くときの動作を表す処理 |
● クラスを使ってみよう(インスタンスの作成)
クラスはあくまで「設計図」。使うにはインスタンス(実物)を作ります。
public class Main {
public static void main(String[] args) {
Pen myPen = new Pen(); // Penのインスタンスを作成
myPen.color = "青"; // 色を設定
myPen.hasCap = true; // キャップがある
myPen.write(); // 書くメソッドを呼び出す
}
}
実行結果:
書いています...
このようにして、「設計図」から実際の「動くもの(myPen)」を作り、それに値をセットし、メソッドを呼び出すことで動かします。
● 重要ポイントのまとめ
- クラスは、データ(フィールド)と処理(メソッド)をひとまとめにした設計図
- クラスから作った実体が インスタンス
- インスタンスには、データをセットし、メソッドで動かすことができる
3. インスタンスの作り方と使い方¶
Javaでは、クラス(設計図)からインスタンス(実物)を作って使います。ここでは「ペン」を例にして、クラスからオブジェクトを作り、それをどう使うかを見ていきましょう。
ステップ1:クラスの定義(設計図をつくる)
public class Pen {
String color;
boolean hasCap;
public void write() {
System.out.println("書いています...");
}
}
🔍 解説
-
- String color;
- → ペンの「色」を表します(状態:青、赤、黒…など)。
-
- boolean hasCap;
- → ペンに「キャップがあるかどうか」を表します(true/false)。
-
- public void write()
- → ペンで文字を書く動作を表すメソッドです。実行すると "書いています..." と表示されます。
このように、データ(フィールド)と動き(メソッド)をセットで定義しているのが、クラスです。
ステップ2:インスタンスの生成(実物をつくる)
Pen myPen = new Pen();
🔍 解説
- new Pen():Penクラス(設計図)から実物を作る
- myPen:その実物を参照する変数(ペンの名前のようなもの)
これで、myPen は「青いペン」や「キャップつきのペン」としてカスタマイズできる実物になります。
ステップ3:フィールドに値を入れる(ペンの特徴を決める)
myPen.color = "青";
myPen.hasCap = true;
🔍 解説
- color に "青" を代入 → 青いペン
- hasCap に true を代入 → キャップあり
インスタンスは、自分の持つデータ(状態)を自由に変えることができます。
ステップ4:メソッドを呼び出す(動かす)
myPen.write();
🔍 解説
- myPen が持っている write() メソッドを呼び出しています。
- 実行すると、「書いています…」というメッセージが表示されます。
このように、インスタンスが持つメソッド(ふるまい)を使うことで、実際に「動かす」ことができます。
全体の流れ(コード)
public class Main {
public static void main(String[] args) {
Pen myPen = new Pen(); // ペンを作成
myPen.color = "青"; // 色を設定
myPen.hasCap = true; // キャップあり
myPen.write(); // 書くメソッドを実行
}
}
📌 まとめ:インスタンスを使う流れ
ステップ | 内容 | 例文 |
---|---|---|
① クラス定義 | 設計図を作る | public class Pen {...} |
② インスタンス生成 | 実物を作る | Pen myPen = new Pen(); |
③ フィールド設定 | 状態(データ)を与える | myPen.color = "青"; |
④ メソッド実行 | 動きを使う(ふるまい) | myPen.write(); |
4. クラスで「状態」と「ふるまい」を表現する¶
クラスは「データ」と「処理」のセット
オブジェクト指向では、オブジェクトは状態(データ)とふるまい(処理)を持つものとして考えます。 Javaでは、それぞれ以下のように表現されます。
- 状態:フィールド(インスタンス変数)で表現
- ふるまい:メソッドで表現
🖊 ペンの例で見てみよう
前のセクションで使った Pen クラスを思い出してください。このクラスでは次のように状態とふるまいを表現していました:
public class Pen {
String color; // 状態(色)
boolean hasCap; // 状態(キャップがあるか)
public void write() {
System.out.println("書いています..."); // ふるまい(書く動作)
}
}
🎯 状態とふるまいはセットで意味を持つ
現実世界のモノを思い出してみてください。たとえば:
- 車:
- 状態:スピード、燃料、色
- ふるまい:走る、止まる、曲がる
- 犬:
- 状態:名前、年齢、種類
- ふるまい:吠える、座る、歩く
Javaでは、このように「状態」と「ふるまい」をセットにして定義することで、現実世界のモノをプログラムで再現できます。
✨ なぜ状態とふるまいをセットにするのか?
これにより、オブジェクトが「自分の状態に応じて動作する」ようになります。
if (myPen.hasCap) {
myPen.write();
}
このように、「キャップがあるなら書く」という状態とふるまいの組み合わせが可能になります。 これは、プログラムに意味や柔軟性、拡張性を持たせるために非常に重要です。
✅ まとめ
用語 | 意味 | Penクラスの例 |
---|---|---|
状態 | オブジェクトの情報 | color , hasCap |
ふるまい | オブジェクトの動き | write() メソッド |
5. クラスとインスタンスの例:ペンを表現する¶
このセクションでは、前に学んだ「クラス」や「インスタンス」、「状態とふるまい」の知識を使って、 複数のペンを作り、それぞれが異なる状態や動きをする例を見ていきます。
🎨 クラスから「実物(インスタンス)」を複数作る
たとえば、以下のような Pen クラスを用意します:
public class Pen {
String color;
boolean hasCap;
public void write() {
if (hasCap) {
System.out.println(color + "のインクで書いています。");
} else {
System.out.println("キャップがないので書けません。");
}
}
}
このクラスから、2つのインスタンス(実物のペン)を作ってみましょう。
🧪 複数インスタンスを作るコード例
public class Main {
public static void main(String[] args) {
Pen bluePen = new Pen();
bluePen.color = "青";
bluePen.hasCap = true;
Pen redPen = new Pen();
redPen.color = "赤";
redPen.hasCap = false;
bluePen.write(); // 出力: 青のインクで書いています。
redPen.write(); // 出力: キャップがないので書けません。
}
}
🧠 ポイント:インスタンスごとに「状態」が違う
- bluePen と redPen は、同じクラス Pen から作られたにもかかわらず、
- color や hasCap といった「状態」がそれぞれ異なるため、
- 同じ write() メソッドを使っても、出力される結果が違うのです。
これは、オブジェクト指向の重要な特徴のひとつである「状態ごとのふるまい」を表しています。
📌 まとめ
インスタンス名 | 状態(color / hasCap) | ふるまいの結果 |
---|---|---|
bluePen | “青” / true | 青のインクで書いています。 |
redPen | “赤” / false | キャップがないので書けません。 |
このように、「クラス」という設計図から、好きな数だけオブジェクト(インスタンス)を作り、 それぞれに違う「状態」を与えて、同じ「ふるまい」を呼び出すことで、多様な動作を表現することができます。
- インスタンスはそれぞれ独立している
これまでに学んだように、クラスは「設計図」であり、そこから作られるインスタンス(実体)は、それぞれ独立しています。
🖊️ Penクラスの再利用
public class Pen {
String color;
boolean hasCap;
public void write() {
if (hasCap) {
System.out.println(color + "のインクで書いています。");
} else {
System.out.println("キャップがないので書けません。");
}
}
}
🧪 例:状態の変化と独立性
public class Main {
public static void main(String[] args) {
Pen penA = new Pen();
penA.color = "青";
penA.hasCap = true;
Pen penB = new Pen();
penB.color = "赤";
penB.hasCap = true;
penA.write(); // 青のインクで書いています。
penB.write(); // 赤のインクで書いています。
// penAのキャップを外してみる
penA.hasCap = false;
penA.write(); // キャップがないので書けません。
penB.write(); // 赤のインクで書いています。(変わらない!)
}
}
✅ ポイント
- penA の hasCap を false に変更しましたが、penB には影響しません。
- 同じ Pen クラスから作られていても、インスタンス同士は完全に別物です。
🧠 イメージ:設計図から作られた製品
以下のようなイメージを持つと分かりやすいです:
設計図(クラス) | 実物(インスタンス)その1 | 実物(インスタンス)その2 |
---|---|---|
ペンの設計図 | 青・キャップあり | 赤・キャップなし |
→ 設計図は同じでも、作られた実物は別々に使える。
🧬 メモリ上でも「別の場所」に存在している
Javaでは、new を使ってインスタンスを生成すると、それぞれ異なるメモリ領域が確保されます。 つまり、penA と penB は物理的にもプログラム上でも「別々の存在」です。
📌 まとめ
- インスタンスはそれぞれ独立して存在する
- 状態の変更はそのインスタンスだけに影響する
- 同じクラスからでも、多様な「モノ」を作ることができる
6. 練習問題¶
【問題1】〇か×で答えよう
次の文が正しければ〇、間違っていれば×で答えてください。
- 同じクラスから作られたインスタンス同士は、メモリ上でも同じ場所を共有する。
回答と解説(クリックして表示)
×
→ インスタンスはそれぞれ独立したメモリ上に存在するため、共有していません。
- インスタンスAの状態を変更しても、インスタンスBには影響しない。
回答と解説(クリックして表示)
○
→ 片方のインスタンスの変更は、もう一方には影響しません。
- クラスは実体であり、色や状態を記録するための情報を個別に持っている。
回答と解説(クリックして表示)
×
→ 実体(情報を個別に持つの)はインスタンスであり、クラスはあくまで設計図です。
- クラスは設計図であり、実際に動作する「モノ」はインスタンスである。
回答と解説(クリックして表示)
○
→ クラスは設計図、インスタンスが「実物」です。
【問題2】コードを読んで、出力を予想しよう
以下のコードを見て、プログラムを実行したときの標準出力内容を答えてください。
public class Pen {
String color;
boolean hasCap;
public void write() {
if (hasCap) {
System.out.println(color + "のペンで書いています。");
} else {
System.out.println("キャップがないので書けません。");
}
}
}
public class Main {
public static void main(String[] args) {
Pen pen1 = new Pen();
pen1.color = "黒";
pen1.hasCap = true;
Pen pen2 = new Pen();
pen2.color = "緑";
pen2.hasCap = false;
pen1.write();
pen2.write();
pen1.hasCap = false;
pen1.write();
pen2.write();
}
}
回答と解説(クリックして表示):
出力結果:
黒のペンで書いています。
キャップがないので書けません。
キャップがないので書けません。
キャップがないので書けません。
解説:
- 最初、pen1 はキャップあり → 書ける
- pen2 はキャップなし → 書けない
- pen1 のキャップを外したので → 書けなくなった
- pen2 は最初からキャップなしなので → 書けないまま
【問題3】自分でクラスを作ってみよう(簡易コーディング課題)
以下の仕様に従って、自分でJavaのクラスとインスタンスを作ってみましょう。
- クラス名は Lamp
- フィールド(状態):
- boolean isOn(点灯しているかどうか)
- メソッド(ふるまい):
- void turnOn() → 「ライトをつけました」と表示し、isOn を true に
- void turnOff() → 「ライトを消しました」と表示し、isOn を false に
やること:
- Lamp クラスを作る
- lampA と lampB の2つのインスタンスを作成する
- lampA は点灯し、lampB は消灯する
- それぞれの状態を確認するように出力する
回答例と解説(クリックして表示):
public class Lamp {
boolean isOn;
public void turnOn() {
isOn = true;
System.out.println("ライトをつけました。");
}
public void turnOff() {
isOn = false;
System.out.println("ライトを消しました。");
}
}
public class Main {
public static void main(String[] args) {
Lamp lampA = new Lamp();
Lamp lampB = new Lamp();
lampA.turnOn(); // → ライトをつけました。
lampB.turnOff(); // → ライトを消しました。
}
}
解説:
- lampA と lampB は別々のインスタンス
- それぞれ独自の isOn 状態を持っており、干渉しません