🙄
Java Silver 勉強⑥継承による実装の再利用
【出題項目の例】
- Javaの基本データ型と文字列の操作
- 演算子と制御構造
- 配列の操作
- クラスの宣言とインスタンスの使用
- メソッドの作成と使用
- カプセル化の適用
- 継承による実装の再利用
- インタフェースによる抽象化
- 例外処理
- モジュール・システム
継承による実装の再利用
1. 継承の基本
Java では extends キーワードを使って、既存のクラス(親クラス)を継承できます。
継承したクラス(子クラス)は、親クラスのフィールドやメソッドを引き継ぐことができます。
// 親クラス(スーパークラス)
class Animal {
String name = "動物";
void makeSound() {
System.out.println("何かの音を出す");
}
}
// 子クラス(サブクラス)
class Dog extends Animal {
void bark() {
System.out.println("ワンワン!");
}
}
public class Main {
public static void main(String[] args) {
Dog dog = new Dog();
System.out.println(dog.name); // 親クラスのフィールドを継承
dog.makeSound(); // 親クラスのメソッドを継承
dog.bark(); // 子クラス独自のメソッド
}
}
実行結果
動物
何かの音を出す
ワンワン!
2. メソッドのオーバーライド(Override)
親クラスのメソッドを子クラスで上書き(オーバーライドすることができます。
オーバーライドする際は、@Override アノテーションを付けるのが一般的です。
class Animal {
void makeSound() {
System.out.println("動物の音");
}
}
class Dog extends Animal {
@Override
void makeSound() {
System.out.println("ワンワン!");
}
}
public class Main {
public static void main(String[] args) {
Animal animal = new Animal();
animal.makeSound(); // 動物の音
Dog dog = new Dog();
dog.makeSound(); // ワンワン!(オーバーライドされたメソッド)
}
}
3. コンストラクタと super
- 子クラスのコンストラクタでは、親クラスのコンストラクタを
superで呼び出すことができます。 - 親クラスに引数ありのコンストラクタがある場合、子クラスで
super(引数)を必ず呼ぶ必要があります。
class Animal {
String name;
// 親クラスのコンストラクタ
Animal(String name) {
this.name = name;
}
}
class Dog extends Animal {
Dog(String name) {
super(name); // 親クラスのコンストラクタを呼ぶ
}
void showName() {
System.out.println("犬の名前: " + name);
}
}
public class Main {
public static void main(String[] args) {
Dog dog = new Dog("ポチ");
dog.showName(); // 犬の名前: ポチ
}
}
4. final の使い方
final キーワードを使うと、継承やオーバーライドを制限できます。
4-1 final クラス
final をクラスにつけると、そのクラスは継承できなくなる。
final class Animal { } // これを継承しようとするとコンパイルエラー
// class Dog extends Animal { } // ❌ エラー!
4-2 final メソッド
final をメソッドにつけると、そのメソッドはオーバーライドできなくなる。
class Animal {
final void makeSound() {
System.out.println("動物の音");
}
}
class Dog extends Animal {
// void makeSound() { // ❌ エラー!
// System.out.println("ワンワン!");
// }
}
5. instanceof を使った型の判定
継承を使ってオブジェクトの型を判定することもできます。
class Animal { }
class Dog extends Animal { }
public class Main {
public static void main(String[] args) {
Animal a = new Dog(); // Dog型をAnimal型として扱う(アップキャスト)
if (a instanceof Dog) {
System.out.println("a は Dog 型です");
}
}
}
実行結果
a は Dog 型です
ポイント
| 項目 | 説明 |
|---|---|
extends |
親クラスを継承するときに使用 |
| メソッドのオーバーライド | 親クラスのメソッドを上書き(@Override を使う) |
super() |
親クラスのコンストラクタを呼ぶ |
final クラス |
継承できなくする |
final メソッド |
オーバーライドできなくする |
instanceof |
あるオブジェクトが特定の型かどうかを判定 |
Discussion