#08:オブジェクト指向
このチャプターでは、オブジェクト指向について学習します。
プログラムを「モノ」の集まりとしてとらえ、それらの「モノ」が互いに連携しあうことで、プログラム全体を構成する考え方。
関連性の強い「属性」と「動作」を 1 つにまとめ、「モノ」=「オブジェクト」として扱う。
プログラムの再利用性や保守性、拡張性が向上することが期待できる。
クラス: オブジェクトの設計図のようなもの
インスタンス: 設計図から生成された具体的なオブジェクト// クラス
class Car { ... }
// インスタンス
Car myCar = new Car();
クラス変数: 同じクラスから生成されたインスタンス全体で共有される属性・データ。
クラス変数の値を変更すると、そのクラスから生成されたすべてのインスタンスにおいて値が変更される。
インスタンス変数 (フィールド): クラスの中に定義され、各インスタンスが保持する属性・データのこと。
フィールドと呼ばれることもある。
各インスタンスに属し、ほかのインスタンスとは異なる値を保持できる。
クラス変数とインスタンス変数をまとめて、メンバ変数と呼ぶこともある。
また、クラスに定義されている処理のことを「メソッド」と呼ぶ。class Car {
// クラス変数
static int numberOfTires = 4;
// インスタンス変数
String color;
String model;
}
クラスからインスタンスを生成する際、初期化をおこなうために一度だけ呼び出される特別なメソッド。
インスタンス変数に初期値を設定したり、必要なリソースを確保したりするのが主な役割。
戻り値を持たず、インスタンスを生成したときに自動的に呼び出される。
引数を受け取ることで、処理を柔軟にカスタマイズすることも可能。class Car {
String color;
String model;
// コンストラクタ
public Car(String color, String model) {
this.color = color;
this.model = model;
}
}
クラスの属性や動作を引き継いで、新しいクラスを作成すること。
継承元のクラスを「スーパークラス」、継承先のクラスを「サブクラス」と呼ぶ。
サブクラスは、スーパークラスのメンバ変数やメソッドをそのまま利用できるが、必要に応じて独自のメンバ変数やメソッドを追加することも可能。// スーパークラス
class Car { ... }
// サブクラス
class Truck extends Car { ... }
class SportsCar extends Car { ... }
サブクラスがスーパークラスから継承したメソッドを、サブクラスで再定義すること。
オーバーライドにより、スーパークラスのメソッドの動作を変更したり、拡張したりできる。
処理を変更せず、スーパークラスの処理をそのまま利用したり、スーパークラスの処理を呼び出しつつサブクラス独自の処理を追加したりすることも可能。class Car {
void drive() {
System.out.println("Driving a car");
}
}
class SportsCar extends Car {
@Override
void drive() {
System.out.println("Driving a sports car");
}
}
1 つのクラス内で、同じ名前のメソッドを複数定義すること。
同じ名前のメソッドでも、引数の型や数が異なる場合に、異なる処理を実行できる。
これにより、メソッド名を統一しつつ、さまざまな引数に対応した処理を実装できる。class Car {
void speedUp() {
System.out.println("Speeding up by 10 km/h");
}
void speedUp(int targetSpeed) {
System.out.println("Speeding up to " + targetSpeed + " km/h");
}
void speedUp(String mode) {
if (mode.equals("turbo")) {
System.out.println("Speeding up in turbo mode!");
} else {
System.out.println("Speeding up in normal mode.");
}
}
}