Java の継承のメリットとは?コードの再利用をしやすくする方法を初心者向けに解説
新人
「Javaで同じようなコードを何回も書くのって、面倒じゃないですか?」
先輩
「そのとおり。だからJavaには継承という便利な仕組みがあるんだ。あるクラスの機能を別のクラスで引き継ぐことができるんだよ。」
新人
「引き継ぐ?具体的にはどうやって使うんですか?」
先輩
「じゃあまず、Javaの継承の基本と、なぜコードの再利用に役立つのかを一緒に見ていこう!」
1. Javaの継承とは?(簡単な意味と例)
Javaの継承とは、すでにあるクラス(親クラス)の機能を、別のクラス(子クラス)が引き継ぐことができる仕組みです。
たとえば、「動物」を表すAnimalという親クラスを作って、「犬」や「猫」などの子クラスでその機能をそのまま使えるようにすることができます。
継承を使うと、同じコードを何度も書かずに済むため、コードの再利用がとても簡単になります。
Javaでは、子クラスを定義するときにextendsというキーワードを使います。
public class Animal {
void eat() {
System.out.println("食べます。");
}
}
public class Dog extends Animal {
void bark() {
System.out.println("ワンワン!");
}
}
このように書くと、DogクラスはAnimalクラスのeat()メソッドを引き継いで使えるようになります。
実際に動かしてみると、以下のようになります。
public class Main {
public static void main(String[] args) {
Dog dog = new Dog();
dog.eat(); // 親クラスのメソッド
dog.bark(); // 子クラスのメソッド
}
}
食べます。
ワンワン!
このように、Javaの継承を使えば、親クラスに書いた機能をそのまま子クラスで使うことができるのです。
2. コードの再利用ってどういうこと?(未経験者にもわかるように)
コードの再利用とは、すでに作ったコードを別の場所でも使えるようにすることです。プログラムでは、同じような動作を何度も書くことがありますが、それを毎回書いていたらとても大変です。
たとえば、「名前を表示する」や「歩く」など、いろいろなクラスで似たような動きが必要になることがあります。
そのとき、すべてのクラスに同じようなメソッドを一から書くよりも、親クラスに共通の動作をまとめて書いておいて、子クラスで引き継ぐようにすれば、重複せずにすっきりしたコードになります。
例を見てみましょう。まず、共通の動きを親クラスに書きます。
public class Vehicle {
void move() {
System.out.println("走ります。");
}
}
このVehicleクラスをCarとBikeという子クラスで継承します。
public class Car extends Vehicle {
void honk() {
System.out.println("クラクションを鳴らします。");
}
}
public class Bike extends Vehicle {
void ringBell() {
System.out.println("ベルを鳴らします。");
}
}
そして、Mainクラスで両方を動かします。
public class Main {
public static void main(String[] args) {
Car car = new Car();
car.move(); // 親クラスのメソッド
car.honk(); // 子クラスのメソッド
Bike bike = new Bike();
bike.move(); // 親クラスのメソッド
bike.ringBell(); // 子クラスのメソッド
}
}
走ります。
クラクションを鳴らします。
走ります。
ベルを鳴らします。
このように、move()という共通の動作をVehicleに一度だけ書いておけば、CarでもBikeでも何度でも再利用できます。
もしこのコードに継承がなかったら、CarにもBikeにも、同じ内容のmove()メソッドを別々に書かなければならず、手間がかかるうえに、後で修正するときにも大変です。
だからこそ、Javaの継承はとても重要なのです。親クラスに共通の機能をまとめ、子クラスでは追加の動きを書くだけにしておくと、効率よく開発できます。
このように、コードの再利用を意識して設計することで、Javaのプログラムは読みやすくなり、管理もしやすくなるのです。
3. 継承を使うとどんなところが楽になるのか(繰り返しを減らす)
Javaの継承を使うと、いろいろな場面でコードを書く手間が減ります。その理由は、共通の動作を親クラスにまとめることで、子クラスがそれを何度でも再利用できるからです。
たとえば、アプリで「ユーザー」や「管理者」など複数の種類の人を扱うとき、それぞれに「ログインする」「ログアウトする」という機能が必要になることがあります。
このようなとき、共通の動きをすべてのクラスに毎回書くと、手間も時間もかかります。さらに、後で修正したいときは、すべてのクラスを探して直さないといけないので、とても大変です。
でも、継承を使えば共通の動作は親クラスにまとめておくだけでよくなります。
以下のコードを見てみましょう。
public class User {
void login() {
System.out.println("ログインしました。");
}
void logout() {
System.out.println("ログアウトしました。");
}
}
public class Member extends User {
void viewProfile() {
System.out.println("プロフィールを表示します。");
}
}
public class Admin extends User {
void manageUsers() {
System.out.println("ユーザーを管理します。");
}
}
MemberクラスとAdminクラスは、Userクラスを継承しているので、login()やlogout()といった共通の機能をそのまま使えます。
public class Main {
public static void main(String[] args) {
Member m = new Member();
m.login(); // 親クラスの機能
m.viewProfile(); // 子クラスの機能
Admin a = new Admin();
a.login(); // 親クラスの機能
a.manageUsers(); // 子クラスの機能
}
}
ログインしました。
プロフィールを表示します。
ログインしました。
ユーザーを管理します。
このように、Javaの継承を使うと、同じようなコードの繰り返しを避けることができ、プログラム全体がすっきりします。
4. Javaでよくある継承の使い方(具体的なコード付き)
Javaでは、現実のものをクラスに見立てる「オブジェクト指向」という考え方があります。その中で、継承はとてもよく使われます。
たとえば、動物を表すAnimalというクラスを作り、それを使ってDogやBirdなどの子クラスを作るという方法がよくあります。
public class Animal {
String name;
void introduce() {
System.out.println("私は" + name + "です。");
}
}
public class Dog extends Animal {
void bark() {
System.out.println("ワンワン!");
}
}
public class Bird extends Animal {
void chirp() {
System.out.println("チュンチュン");
}
}
このように設計することで、introduce()メソッドをDogでもBirdでも共通して使えるようになります。
public class Main {
public static void main(String[] args) {
Dog d = new Dog();
d.name = "ポチ";
d.introduce();
d.bark();
Bird b = new Bird();
b.name = "ピヨ";
b.introduce();
b.chirp();
}
}
私はポチです。
ワンワン!
私はピヨです。
チュンチュン
このように、Javaの継承は、親クラスに共通の動きを書き、子クラスでそれを引き継いで使う、というのが基本の使い方です。
5. 実際に書いてみよう!Pleiadesで継承を体験
Pleiadesを使えば、Javaの継承も簡単に試すことができます。ここでは、クラスをファイルに分けて作る方法を紹介します。
まず、親クラスとなるAnimal.javaを作ります。
public class Animal {
String name;
void greet() {
System.out.println(name + "があいさつします。");
}
}
次に、子クラスとなるCat.javaを作ります。
public class Cat extends Animal {
void meow() {
System.out.println("ニャー");
}
}
最後にMain.javaを作って動かします。
public class Main {
public static void main(String[] args) {
Cat cat = new Cat();
cat.name = "ミケ";
cat.greet();
cat.meow();
}
}
ミケがあいさつします。
ニャー
このように、クラスを分けて作ることで、役割がはっきりして、あとから読み直すときにもとてもわかりやすくなります。
まずは簡単な親クラスと子クラスを作って、Javaの継承をPleiadesで実際に体験してみましょう。
6. 継承を使うと将来の変更にも強くなる(修正や追加がラク)
Javaの継承は、将来コードを直したり機能を増やしたりするときにも大きな力を発揮します。なぜなら、親クラスにまとめた処理を変えるだけで、子クラスにもその変更が自動で反映されるからです。
たとえば、すべての動物が「食べる」動作を持っているとしましょう。最初は単純に「食べます」と表示するだけのメソッドを用意していたとします。
public class Animal {
void eat() {
System.out.println("食べます。");
}
}
もしあとで「○○が食べます」と名前付きに変えたくなったら、親クラスのコードを変更するだけで、すべての子クラスに影響を与えることができます。
public class Animal {
String name;
void eat() {
System.out.println(name + "が食べます。");
}
}
これで、DogでもCatでもBirdでも、新しい「食べ方」がすぐに使えるようになります。
このように、Javaの継承は変更に強い設計を可能にし、メンテナンスの手間を減らすのに役立ちます。
7. 継承で整理されたコードは読みやすい(保守しやすさ)
Javaの継承を使うと、プログラムの見通しがよくなり、誰かが後から読んでも理解しやすくなります。これはチームで開発するときにもとても大事です。
たとえば、共通の処理が複数のクラスにバラバラに書かれていると、あとから読んだ人が「この処理はどこでどう使われているのか?」を調べるのに苦労します。
でも、継承を使って共通の処理を親クラスに集めておけば、「この処理は親にある」とすぐにわかるので、探す手間がなくなります。
コードの例で見ると以下のようになります。
public class Animal {
void sleep() {
System.out.println("眠ります。");
}
}
public class Dog extends Animal {
void bark() {
System.out.println("ワンワン!");
}
}
このように、親クラスのsleep()がどの動物にも共通して使われていれば、すべてのクラスに個別に書く必要がなくなります。コードが短くなるだけでなく、どこで何をしているかが一目でわかるようになります。
結果として、プログラムの修正や追加が必要になったときも、迷うことなく安全に作業ができます。
8. Javaの継承を活かして、やさしく設計しよう(初心者へのアドバイス)
ここまで見てきたように、Javaの継承はコードの再利用や保守のしやすさ、将来の変更への強さなど、たくさんのメリットがあります。
でも、最初から難しい仕組みにしようとせず、小さな継承から始めるのがコツです。
たとえば、「人」という親クラスを作って、「学生」や「先生」などの子クラスを作るという考え方はとても自然でわかりやすいです。
現実の世界で「共通点」があるものは、Javaでも「親子関係」で設計できます。以下のように考えると、プログラムも書きやすくなります。
- 人は「話す」や「歩く」が共通 ⇒ 親クラスに書く
- 学生は「勉強する」、先生は「教える」 ⇒ 子クラスに書く
このように、共通する部分を親にまとめ、違う部分は子で表現すると、無理のない設計になります。
初心者のうちは、「共通点は親」「特徴は子」という考えを意識してみてください。
Pleiadesで自分でコードを書いて、何度も動かしてみることで、継承の便利さがどんどん身についてきます。
まずは「親クラスを1つ、子クラスを2つ」くらいから始めて、自分だけのJavaプログラムを作ってみましょう。楽しみながら学べば、自然とJavaの書き方が身についていきます。