クラスとは
クラスは、共通の属性や動作を持つ一連の実体を抽象的に表現するための設計図です。現実世界の事物をプログラム上でモデル化する手段であり、特定の種類のオブジェクトを作成するためのテンプレートとして機能します。
例:「車」という概念は、ブランド、色、価格といった属性と、「走行」「停止」などの行動を持つことができます。これをCarというクラスとして定義できます。
オブジェクト(インスタンス)とは
オブジェクトは、クラスに基づいてメモリ上に生成された具体的な実体です。クラスが設計図なら、オブジェクトはその設計図から作られた製品に相当します。
例:具体的な車である「赤いBMW」や「青いベンツ」は、Carクラスのインスタンスです。
クラスの構造
Javaでクラスを定義するには、以下の要素を含めることが一般的です:
- フィールド(メンバ変数):状態を表すデータ(名詞的性質)
- メソッド:振る舞いを表す処理(動詞的性質)
- コンストラクタ:インスタンス生成時の初期化を行う
- 初期化ブロック:名前のないコードブロックで、インスタンス生成時に自動実行
- 内部クラス:他のクラス内に定義されるクラス
Carクラスの定義
まず、クラスの骨組みを定義します。アクセス修飾子にはpublicを使用し、クラス名はキャメルケースで先頭を大文字にします。
public class Car {
// フィールドの宣言
private String brand;
private String color;
private double price;
// コンストラクタによる初期化
public Car(String brand, String color, double price) {
this.brand = brand;
this.color = color;
this.price = price;
}
// 行動を表すメソッド群
public void startEngine() {
System.out.println(brand + " のエンジンが始動しました。");
}
public void move() {
System.out.println(brand + " が走り出しました。");
}
public void applyBrakes() {
System.out.println(brand + " がブレーキをかけました。");
}
public void turnOff() {
System.out.println(brand + " のエンジンが停止しました。");
}
// ゲッターメソッド(カプセル化の一環)
public String getBrand() {
return brand;
}
public String getColor() {
return color;
}
public double getPrice() {
return price;
}
}
オブジェクトの生成と使用
クラスを使ってオブジェクトを生成するには、newキーワードを使います。これによりヒープ領域にメモリが確保され、コンストラクタが呼び出されて初期化が行われます。
public class Main {
public static void main(String[] args) {
// 最初のインスタンス生成
Car car1 = new Car("BMW", "Red", 85000.0);
car1.startEngine();
car1.move();
car1.applyBrakes();
car1.turnOff();
System.out.println("---");
// 二つ目のインスタンス生成
Car car2 = new Car("Mercedes", "Blue", 92000.0);
car2.startEngine();
car2.move();
car2.applyBrakes();
car2.turnOff();
}
}
出力結果:
BMW のエンジンが始動しました。 BMW が走り出しました。 BMW がブレーキをかけました。 BMW のエンジンが停止しました。 --- Mercedes のエンジンが始動しました。 Mercedes が走り出しました。 Mercedes がブレーキをかけました。 Mercedes のエンジンが停止しました。
クラスとオブジェクトの関係
- クラスは設計図、オブジェクトはその設計図から作られた実体
- 一つのクラスから複数の異なる状態を持つオブジェクトを生成できる
- 各オブジェクトは独立したメモリ領域を持ち、それぞれのフィールド値は互いに影響しない
- 開発の流れとしては、先にクラスを設計し、その後でオブジェクトをインスタンス化する
まとめ
Javaは純粋なオブジェクト指向言語であり、すべての処理はクラスとそのインスタンス(オブジェクト)を通じて行われます。クラスによって共通の構造と振る舞いを定義し、オブジェクトによってそれらを具体化することで、現実世界の複雑さを効率的にモデル化できます。また、カプセル化やprivateフィールドの使用により、データの整合性を保ちつつ柔軟な設計が可能になります。