コンテンツにスキップ

クラスとインスタンス

本章の目的

  • オブジェクト指向における「設計」と「実体化」の基本を理解すること
  • 自分で簡単なクラスを作り、複数のインスタンスで使い分けられるようになること

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("書いています...");  // ふるまい(書く動作)
    }
}
このように、状態(フィールド)として color や hasCap を持ち、 ふるまい(メソッド)として write() を持っています。

🎯 状態とふるまいはセットで意味を持つ

現実世界のモノを思い出してみてください。たとえば:

  • 車:
    • 状態:スピード、燃料、色
    • ふるまい:走る、止まる、曲がる
  • 犬:
    • 状態:名前、年齢、種類
    • ふるまい:吠える、座る、歩く

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 キャップがないので書けません。

このように、「クラス」という設計図から、好きな数だけオブジェクト(インスタンス)を作り、 それぞれに違う「状態」を与えて、同じ「ふるまい」を呼び出すことで、多様な動作を表現することができます。

  1. インスタンスはそれぞれ独立している

これまでに学んだように、クラスは「設計図」であり、そこから作られるインスタンス(実体)は、それぞれ独立しています。

🖊️ 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】〇か×で答えよう

次の文が正しければ〇、間違っていれば×で答えてください。

  1. 同じクラスから作られたインスタンス同士は、メモリ上でも同じ場所を共有する。
回答と解説(クリックして表示)

×

→ インスタンスはそれぞれ独立したメモリ上に存在するため、共有していません。

  1. インスタンスAの状態を変更しても、インスタンスBには影響しない。
回答と解説(クリックして表示)

→ 片方のインスタンスの変更は、もう一方には影響しません。

  1. クラスは実体であり、色や状態を記録するための情報を個別に持っている。
回答と解説(クリックして表示)

×

→ 実体(情報を個別に持つの)はインスタンスであり、クラスはあくまで設計図です。

  1. クラスは設計図であり、実際に動作する「モノ」はインスタンスである。
回答と解説(クリックして表示)

→ クラスは設計図、インスタンスが「実物」です。

【問題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 に

やること:

  1. Lamp クラスを作る
  2. lampA と lampB の2つのインスタンスを作成する
  3. lampA は点灯し、lampB は消灯する
  4. それぞれの状態を確認するように出力する
回答例と解説(クリックして表示):
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 状態を持っており、干渉しません