Javaの継承とは?書き方や使い方をわかりやすく解説

Javaを学び始めたばかりの人にとって、「継承」という言葉は少し難しく聞こえるかもしれません。
しかし、継承は仕組みがわかればそこまで難しいものではありません。
この記事では、Javaの継承の基本から実践的な使い方、注意点までを丁寧に解説します。
最後には練習問題とよくある質問もあるので、しっかり理解を深めていきましょう。
継承の基本:仕組みと考え方
継承(けいしょう)とは、「あるクラス(親クラス)の特徴や機能を、別のクラス(子クラス)が引き継ぐ仕組み」です。
たとえば、「動物」という親クラスを作っておけば、「犬」や「猫」といった子クラスで、動物としての基本的なふるまい(例:食べる)を再利用できます。これによってコードがシンプルになり、同じ処理を何度も書かなくてよくなります。
継承の基本構文とサンプルコード
Javaで継承を使うときは extends
キーワードを使います。
// 親クラス(スーパークラス)
class Animal {
void eat() {
System.out.println("ごはんを食べます");
}
}
// 子クラス(サブクラス)
class Dog extends Animal {
void bark() {
System.out.println("ワンワン!");
}
}
public class Main {
public static void main(String[] args) {
Dog myDog = new Dog();
myDog.eat(); // 親クラスのメソッド
myDog.bark(); // 子クラスのメソッド
}
}
このように、Dog
クラスは Animal
クラスを継承しているため、eat()
メソッドを自分で定義していなくても使えます。
継承のメリットとは?
継承には、以下のようなメリットがあります。
- コードの再利用がしやすい
- 機能追加がしやすい
- クラス設計が整理される
コードの再利用がしやすい
共通する処理を親クラスに書いておけば、子クラスで何度も同じコードを書く必要がなくなります。
機能追加がしやすい
親クラスをベースに子クラスをどんどん作れるので、新しい機能を後から追加するのが簡単です。
クラス設計が整理される
「親 → 子」という関係がはっきりするので、プログラム全体の構造がわかりやすくなります。
よくある使い方と注意すべきポイント
- メソッドのオーバーライド(上書き)
- final・private の制限に注意
メソッドのオーバーライド(上書き)
子クラスで親クラスのメソッドを同じ名前で書くことで、その動作を変更することができます。これを「オーバーライド」と呼びます。
class Animal {
void sound() {
System.out.println("何かの音");
}
}
class Cat extends Animal {
@Override
void sound() {
System.out.println("ニャー!");
}
}
この例では、Cat
クラスが sound()
メソッドを上書きして、独自の鳴き声を出力するようになっています。
final・private の制限に注意
final
が付いたメソッドはオーバーライドできません。private
のメンバーは継承しても子クラスから直接アクセスできません。
こういった修飾子には注意が必要です。
【演習問題】実際に書いて覚えよう!
- 問題1:車のクラスを継承しよう
- 問題2:オーバーライドを体験しよう
- 問題3:共通の情報を親クラスにまとめよう
問題1:車のクラスを継承しよう
問題: 親クラス Car
に run()
メソッドを定義し、子クラス SportsCar
に turbo()
メソッドを追加してください。
解答例:
class Car {
void run() {
System.out.println("車が走っています");
}
}
class SportsCar extends Car {
void turbo() {
System.out.println("ターボON!加速中!");
}
}
public class Main {
public static void main(String[] args) {
SportsCar myCar = new SportsCar();
myCar.run();
myCar.turbo();
}
}
問題2:オーバーライドを体験しよう
問題: 親クラス Animal
の sound()
メソッドを、子クラス Dog
と Cat
でオーバーライドして、それぞれの鳴き声を表示しましょう。
解答例:
class Animal {
void sound() {
System.out.println("何かの音");
}
}
class Dog extends Animal {
@Override
void sound() {
System.out.println("ワンワン");
}
}
class Cat extends Animal {
@Override
void sound() {
System.out.println("ニャー");
}
}
public class Main {
public static void main(String[] args) {
Dog dog = new Dog();
Cat cat = new Cat();
dog.sound();
cat.sound();
}
}
問題3:共通の情報を親クラスにまとめよう
問題: Person
クラスに名前と自己紹介の機能を持たせて、それを継承した Student
クラスを作りましょう。
解答例:
class Person {
String name;
Person(String name) {
this.name = name;
}
void introduce() {
System.out.println("こんにちは、" + name + "です。");
}
}
class Student extends Person {
Student(String name) {
super(name);
}
void study() {
System.out.println("勉強中です。");
}
}
public class Main {
public static void main(String[] args) {
Student student = new Student("シン");
student.introduce();
student.study();
}
}
よくある質問(FAQ)
- Q1. Javaでは複数のクラスを継承できますか?
- Q2. 継承とインターフェースの違いは?
- Q3. 親クラスのコンストラクタはどう呼ぶの?
- Q4. private 変数にはアクセスできないの?
- Q5. オーバーライドとオーバーロードの違いは?
Q1. Javaでは複数のクラスを継承できますか?
いいえ。Javaはクラスの多重継承をサポートしていません。1つのクラスしか継承できませんが、インターフェースを使えば複数の性質を取り込むことができます。
Q2. 継承とインターフェースの違いは?
- 継承は「機能の引き継ぎ」
- インターフェースは「契約(ルール)の実装」
という違いがあります。
Q3. 親クラスのコンストラクタはどう呼ぶの?
子クラスのコンストラクタの中で super()
を使います。引数がある場合は super(引数)
として指定します。
Q4. private 変数にはアクセスできないの?
はい、private
変数は親クラス内だけで有効です。子クラスからアクセスしたい場合は、getter
や setter
を作る必要があります。
Q5. オーバーライドとオーバーロードの違いは?
- オーバーライド:親クラスのメソッドを子クラスで上書きすること。
- オーバーロード:同じメソッド名で、引数の型や数を変えて複数定義すること。
まとめ:継承を味方につけよう!
継承を使えば、コードの再利用性が高まり、クラス設計もシンプルになります。
最初は戸惑うかもしれませんが、実際に手を動かしてサンプルコードを試すことで、自然と理解が深まります。
この記事をきっかけに、Javaのオブジェクト指向プログラミングの楽しさに触れてみてくださいね。