継承: コードの再利用

extends で継承。implements でインターフェース。

extends
クラスを継承。
implements
インターフェースを実装。
@Override
メソッドを上書き。
家系のDNA (Family DNA)

継承は「家系のDNA」です。 親(Animal)の特徴(name, speak())を子(Dog, Cat)が引き継ぎます。 子は親の能力を持ちながら、独自の能力(@Override speak()で「ワン!」)を追加できます。 ただし、親が多すぎる(多重継承)と血統が複雑になるので、Javaは1つの親しか許可しません。

継承

extends
// 親クラス
public class Animal {
protected String name;
public Animal(String name) {
this.name = name;
}
public void speak() {
System.out.println("...");
}
}
// 子クラス
public class Dog extends Animal {
public Dog(String name) {
super(name); // 親コンストラクタ呼び出し
}
@Override
public void speak() {
System.out.println(name + " says: Woof!");
}
}
// 使用
Animal dog = new Dog("Rex");
dog.speak(); // Rex says: Woof!
実行結果
Rex says: Woof!
Bad
// ❌ Bad: コードの重複
class Cat {
String name;
void eat() { ... }
}
class Dog {
String name; // 重複
void eat() { ... } // 重複
}
Good
// ✅ Good: 継承で共通化
class Animal {
String name;
void eat() { ... }
}
class Cat extends Animal {}
class Dog extends Animal {}

パターン

interface, abstract
// インターフェース
public interface Drawable {
void draw(); // 抽象メソッド
default void reset() { // デフォルト実装
System.out.println("Reset");
}
}
public class Circle implements Drawable {
@Override
public void draw() {
System.out.println("Drawing circle");
}
}
// 抽象クラス
public abstract class Shape {
abstract double area(); // 子クラスで実装
public void describe() { // 共通実装
System.out.println("I'm a shape");
}
}
// 複数インターフェース
class Widget implements Clickable, Draggable {
// ...
}
Tip: 「継承より合成」— 継承を使いすぎない。

合格ライン

@Override を書ける
interface と abstract class の違いを説明できる

参考リンク

演習課題

課題1: 継承
Vehicle クラスを継承して Car と Bike を作成してください。
課題2: @Override
親クラスのメソッドをオーバーライドしてください。

次のステップ