007 クラス (クラスの宣言とオブジェクトの生成)010 解答例

public class Car {
    private String model;
    private String color;
    private int speed;
    private Owner owner;

    // コンストラクタとメソッドの実装は省略

    public void displayInfo() {
        System.out.println("Car Information:");
        System.out.println("Model: " + model);
        System.out.println("Color: " + color);
        System.out.println("Speed: " + speed);

        // Owner クラスの情報も表示
        if (owner != null) {
            System.out.println("\nOwner Information:");
            owner.displayInfo();
        }
    }
}

public class Owner {
    private String name;
    private String address;
    private String phoneNumber;

    // コンストラクタとメソッドの実装は省略

    public void displayInfo() {
        System.out.println("Name: " + name);
        System.out.println("Address: " + address);
        System.out.println("Phone Number: " + phoneNumber);
    }
}

public class Main {
    public static void main(String[] args) {
        // Owner クラスのオブジェクトを生成
        Owner carOwner = new Owner("John Doe", "123 Main St", "555-1234");

        // Car クラスのオブジェクトを生成して初期化
        Car myCar = new Car("Toyota Camry", "Blue", 60, carOwner);

        // Car クラスの情報を表示
        myCar.displayInfo();
    }
}

この例では、Car クラスが Owner クラスのオブジェクトを所有者として保持しています。displayInfo() メソッドを使用して、車の情報だけでなく所有者の情報もコンソールに表示しています。このように、オブジェクト同士の関連性を考慮して情報を表示することができます。

クラスの合成関係

クラスの合成関係(Composition)は、オブジェクト指向プログラミングにおいて、あるクラスが他のクラスを包含し、それが強い依存関係にあり、また包含されたクラスのライフサイクルが包含するクラスに依存している関係を指します。合成関係は、部分と全体の関係を表現するもので、部分が全体に属し、全体の一部であることを示します。

以下に、クラスの合成関係の特徴と例を示します。

合成関係の特徴:

  1. 強い依存関係:
    • 合成関係では、包含されたクラスと包含するクラスの間に強い依存関係があります。包含するクラスが破棄されると、包含されたクラスも破棄されることが一般的です。
  2. ライフサイクルの依存:
    • 包含するクラスのオブジェクトのライフサイクルは、包含するクラスに依存します。通常、包含するクラスのオブジェクトが生成されたり破棄されたりすると、それに含まれるオブジェクトも同様に影響を受けます。
  3. 整合性:
    • 合成関係にあるオブジェクトは通常、整合性を保つために共に存在することが期待されます。例えば、Car クラスとその Engine クラスの関係では、Car オブジェクトが存在するときには必ず Engine オブジェクトも存在するようにしたいと考えることがあります。

合成関係の例:

public class Engine {
    private String type;

    // コンストラクタやメソッドの実装は省略
}

public class Car {
    private String model;
    private Engine engine; // Car クラスが Engine クラスを合成

    // コンストラクタやメソッドの実装は省略

    public void start() {
        if (engine != null) {
            System.out.println("The car with model " + model + " is starting.");
            engine.start();
        } else {
            System.out.println("The car cannot start without an engine.");
        }
    }
}

この例では、Car クラスが Engine クラスを合成しています。Car クラスのオブジェクトは Engine クラスのオブジェクトを所有し、start() メソッドを呼ぶときには Car クラスと Engine クラスが連携しています。また、Car クラスのオブジェクトが生成されるときには、通常その Engine クラスのオブジェクトも同時に生成され、Car クラスが破棄されるときには Engine クラスのオブジェクトも同時に破棄されるようになっています。

「007 クラス」問題集リスト