Javaの継承とは?親クラスの機能を引き継ぐ仕組みを初心者向けに徹底解説
新人
「Javaで親クラスの動きをそのまま使いながら、新しく自分だけの機能を足せる方法はありますか?」
先輩
「あるよ。それが継承と呼ばれる仕組みだ。親クラスの機能を子クラスが引き継ぐことで、同じコードを何度も書かずに済むんだ。」
新人
「同じコードを書かずに済むのは便利そうですね!でも、どうやって書くんでしょう?」
先輩
「実際のJavaコードを見ながら、継承の基本とメリットを順番に確かめてみよう。Pleiadesでプロジェクトを作って試すとすぐに実感できるよ。」
1. Javaの「継承」とは何か(基本の考え方)
Javaの継承は、既存のクラス(親クラス)が持つ変数やメソッドを、新しいクラス(子クラス)がそのまま引き継ぐ仕組みです。親クラスを土台にして、子クラスが新しい機能を付け足すイメージです。
たとえば動物を表すAnimalクラスが「名前」や「食べる動き」をすでに持っているとします。犬を表すDogクラスを作るとき、犬も「名前」や「食べる動き」を持ちますが、親クラスから受け継ぐだけなら同じコードを書かずに済みます。そのうえで「吠える」という犬だけの動きを追加できます。
継承を宣言するには、子クラスの宣言にextendsを付けます。これだけで、子クラス内で親クラスのすべてのメンバ(変数とメソッド)が使えるようになります。
イメージをつかむために、コードを見てみましょう。
public class Animal {
String name; // 親クラスが持つ変数
void eat() { // 親クラスが持つメソッド
System.out.println(name + "が食べています");
}
}
ここではAnimalが親クラスです。次にDogという子クラスを作り、Animalを継承してみましょう。
public class Dog extends Animal { // Animalを継承
void bark() { // 子クラスだけの機能
System.out.println("ワン!");
}
}
子クラスのDogは、宣言の後ろにextends Animalと書くだけで、親クラスAnimalの変数nameやメソッドeat()を引き継ぐことができます。
この仕組みのおかげで、コードを再利用しながら、必要な機能を自由に追加できます。すでに作った親クラスの動きを壊さずに拡張できるので、プログラムの保守や拡張がとても楽になります。
2. 継承を使うと何が便利なのか(イメージしやすい例)
では、継承を使うと何が便利なのか、具体的に見てみましょう。「同じコードを書かない」という節約だけでなく、アプリ全体を分かりやすく整理できるのも大きな利点です。
以下のMainクラスでは、Dogクラスのインスタンスを作り、親クラスから引き継いだメソッドと子クラスで追加したメソッドを順番に呼び出します。
public class Main {
public static void main(String[] args) {
Dog dog = new Dog(); // 子クラスのインスタンス生成
dog.name = "ポチ"; // 親クラスの変数をそのまま利用
dog.eat(); // 親クラスから引き継いだメソッド
dog.bark(); // 子クラスで追加したメソッド
}
}
このプログラムをPleiadesで実行すると、次のような結果が得られます。
ポチが食べています
ワン!
コードを見てわかるように、Dogのインスタンスdogは親クラスAnimalのnameやeat()をそのまま利用できています。また、子クラスだけが持つbark()も追加で呼び出せます。
もし継承を使わずに同じ振る舞いを実現しようとすると、犬ごとにnameやeat()を重複して書く必要があり、クラスが増えるとメンテナンスが大変です。継承を使えば、共通部分を親クラスにまとめ、違いは子クラスにだけ書けば済むので、コードが短く、読みやすくなります。
さらに、継承を活かすと、以下のようなメリットも得られます。
- 拡張性:親クラスを変更するだけで、すべての子クラスに影響を与えられる。
- 一貫性:共通のメンバを親クラスにまとめることで、名前や動きがばらつかない。
- 保守性:バグ修正や機能追加を親クラスに集中できるので、修正漏れを防げる。
このように、Javaの継承は、親クラスの機能を引き継ぐことで、コードを簡潔に保ちつつ、子クラスに新しい特徴を加えられる非常に便利な仕組みです。初めて学ぶときは、「土台を作って上に積み重ねる」というイメージで捉えると、理解しやすくなります。
ぜひPleiadesで小さな親クラスと子クラスを作り、実際に継承の動きを体験してみてください。自分で動かすことで、引き継ぐ仕組みの便利さを肌で感じられるはずです。
3. 親クラスと子クラスの関係(実際のコード例で解説)
ここでは、親クラスと子クラスの関係がどのように成り立っているかを、実際のJavaコードで見ていきましょう。
まず、親クラスであるVehicleクラスを作成します。乗り物全般に共通する「走る」という動きをrunメソッドで表現します。
public class Vehicle {
String name;
void run() {
System.out.println(name + "が走ります。");
}
}
次に、子クラスとしてCarクラスを作成します。このクラスではVehicleを継承し、さらに車ならではの動きであるhornメソッドを追加します。
public class Car extends Vehicle {
void horn() {
System.out.println("プップー!");
}
}
このように、子クラスはextendsを使って親クラスを引き継ぎます。親クラスの変数やメソッドは、子クラス内でthisなどを使わなくてもそのまま使えます。
この関係によって、車は「走る」こともできるし、「クラクションを鳴らす」こともできるという、現実の特徴をプログラムで表現できます。
4. 子クラスが親クラスの機能を使う方法(superキーワードなどは使わない)
Javaの継承では、子クラスが親クラスの持つ変数やメソッドを、特別な記号を使わなくてもそのまま使うことができます。これは非常に便利な点です。
次のコードでは、CarクラスがVehicleクラスからname変数とrun()メソッドを引き継いで使っている様子を確認できます。
public class Main {
public static void main(String[] args) {
Car car = new Car();
car.name = "トヨタ";
car.run(); // 親クラスのメソッド
car.horn(); // 子クラスのメソッド
}
}
このプログラムでは、子クラスのCarが親クラスのnameに値を入れ、run()を呼び出しています。特別な記述なしで親クラスの動きを利用できるのが、継承の強力な特徴です。
トヨタが走ります。
プップー!
このように、Javaでは、親クラスで用意された動作を、子クラスでも自然に使うことができます。初心者の方は、まずこの「そのまま使える」という感覚をしっかり理解しておくと、後の学習がスムーズになります。
5. 自分で親クラス・子クラスを作ってみよう(簡単な演習例)
それでは、実際に自分でJavaの継承を使って、親クラスと子クラスを作ってみましょう。今回は「動物」をテーマにして、いくつかの動物を表現してみます。
まずは親クラスとして、Animalクラスを作ります。
public class Animal {
String name;
void move() {
System.out.println(name + "が動いています。");
}
}
次に、この親クラスを引き継ぐ子クラスとして、CatクラスとBirdクラスを作ります。
public class Cat extends Animal {
void meow() {
System.out.println("ニャー");
}
}
public class Bird extends Animal {
void chirp() {
System.out.println("チュンチュン");
}
}
そして、Mainクラスでそれぞれの子クラスのインスタンスを作成して、親クラスのメソッドも子クラスのメソッドも動かしてみましょう。
public class Main {
public static void main(String[] args) {
Cat cat = new Cat();
cat.name = "タマ";
cat.move(); // 親クラスのメソッド
cat.meow(); // 子クラスのメソッド
Bird bird = new Bird();
bird.name = "ピヨ";
bird.move(); // 親クラスのメソッド
bird.chirp(); // 子クラスのメソッド
}
}
タマが動いています。
ニャー
ピヨが動いています。
チュンチュン
このように、親クラスの中に「共通の動き」を書いておけば、それを子クラスが引き継いで使えるため、同じような動作を複数のクラスに重ねて書く必要がなくなります。
さらに、子クラスにしかない動作を加えることで、「ネコは鳴く」「トリはさえずる」といったそれぞれの違いも表現できます。
まずはこのような小さな例からスタートして、継承がプログラムをどう整理し、便利にしてくれるのかを体験してみてください。Pleiadesでプロジェクトを作成し、クラスを分けて実行してみることで、理解がぐっと深まるはずです。
6. 親クラスと子クラスで同じ名前の変数があるとどうなる?
Javaの継承では、親クラスと子クラスの両方に同じ名前の変数があるとき、どちらが使われるのかが重要なポイントになります。
このようなケースは、初心者がよく疑問に思うところです。例えば、親クラスにも子クラスにもnameという変数があるとき、それぞれのクラスで何が起こるのでしょうか。
以下の例を見てください。
public class Animal {
String name = "動物";
}
public class Dog extends Animal {
String name = "犬";
void printName() {
System.out.println(name);
}
}
この例では、親クラスAnimalと子クラスDogの両方に、nameという変数が定義されています。DogクラスのprintName()メソッドでは、どちらのnameが表示されると思いますか?
実際にMainクラスを使って動かしてみましょう。
public class Main {
public static void main(String[] args) {
Dog dog = new Dog();
dog.printName();
}
}
犬
結果は「犬」と表示されました。つまり、子クラスで同じ名前の変数がある場合、子クラスの変数が使われます。親クラスの変数は見えなくなってしまいます。
このような現象を変数のかぶりや隠ぺいと呼ぶことがあります。初心者の方は「親と子で同じ名前を使うと、親のほうが隠れてしまう」という点を覚えておきましょう。
7. 継承を使うときに注意すること(よくある間違いや混乱ポイント)
Javaで継承を使うと便利なことがたくさんありますが、いくつか注意すべき点もあります。ここでは、初心者の方がつまずきやすいポイントを紹介します。
- 同じ名前の変数を子クラスに書かないようにする:先ほどの例でも見たように、親クラスと子クラスで同じ名前の変数があると、どちらが使われるかが分かりにくくなります。
- クラスの関係を整理する:たとえば、
BirdやCatといったクラスは、共通してAnimalというクラスを親にすることができます。似ていないクラス同士で無理に継承すると、かえって混乱のもとになります。 - メソッド名の重複にも注意:親クラスと同じ名前のメソッドを子クラスに書いたとき、どちらが使われるかが変わってしまいます(難しい説明は省きますが、基本的には子クラスのほうが優先されます)。
初心者のうちは、「親クラスの変数やメソッドはそのまま使う」「子クラスでは新しいものを追加するだけ」と考えておくと安全です。
もし親クラスの変数やメソッドと同じ名前を子クラスに書こうとしたら、「これは本当に必要か?」と一度立ち止まって考えるクセをつけましょう。
また、Pleiadesでクラスを作るときは、名前を間違えたり、extendsを忘れたりしないように注意しましょう。Pleiadesではエラーの原因も表示されるので、メッセージをよく読んで対応してください。
8. これからJavaの継承を使っていくためのアドバイス(まとめではなく今後のヒント)
Javaの継承は、プログラムをシンプルに、整理しやすくするための大事な仕組みです。ここでは、これからJavaを学ぶ上でのヒントをいくつか紹介します。
まず、クラスを作るときに、「このクラスはほかのクラスと共通の部分があるか?」と考えてみましょう。たとえば、「ネコ」「イヌ」「トリ」などが出てきたら、「動物」という共通の親クラスを作って、その中に「名前」「動く」などの共通の機能をまとめるのです。
また、実際にコードを書いてみると、同じような処理が何回も出てくることがあります。そのときは「これは親クラスにできないかな?」と考えるようにしましょう。
継承を使うと、次のようなメリットが得られます:
- コードが短くなる
- 同じ処理を何度も書かなくてよくなる
- あとから機能を足したり、直したりするのが楽になる
ただし、無理に継承を使おうとすると、かえってわかりにくくなることもあります。まずは小さな例から試してみて、「本当に必要なとき」に使えるようになりましょう。
おすすめは、自分の好きなテーマでクラスを作ってみることです。たとえば、「果物」「乗り物」「家電製品」など、身の回りにあるものをクラスにして、共通点があるかを考えてみましょう。
最後にもう一度大切なことをまとめておきます:
- 親クラスには共通する機能を書く
- 子クラスには個別の特徴を書く
extendsを使って親子関係を作る- 同じ名前の変数やメソッドには注意
Javaの継承は、少しずつ慣れていけば自然と使いこなせるようになります。Pleiadesを使っていろいろなクラスを試して、親クラスと子クラスの関係を自分なりに体験してみましょう。
まとめ
Javaにおける継承は、プログラミングを効率化するうえでとても重要な考え方です。親クラスから共通の機能やデータを引き継ぐことで、子クラスごとに同じ処理を繰り返す必要がなくなり、プログラムの保守性・拡張性が高まります。この記事では、Animal・Dog・Car・Bird・Catなどの具体例を用いて、親クラスと子クラスの関係性、継承の使い方、Javaにおけるクラス設計の基本を解説しました。
特に注目すべきは、extendsを使うだけで、親クラスに定義された変数やメソッドを子クラスでそのまま使えるという点です。これにより、コードの重複を防ぎ、機能の共通化と独自性の両立が可能になります。
さらに、継承を使うことでクラスの構造が自然に整理され、「動物」「乗り物」といった共通のカテゴリごとにプログラムを設計する力が身につきます。このような設計は、現実世界の概念をそのままコードに落とし込むオブジェクト指向の本質に直結しています。
継承を使う際の注意点としては、同じ名前の変数やメソッドの重複、不適切なクラス設計による混乱、そしてsuperを使う必要があるケースの理解などが挙げられます。初心者のうちは、共通の動きは親クラスへ、それぞれの違いは子クラスへと分けるシンプルな設計を心がけましょう。
以下は、実際にJavaで継承を使う際のサンプルです。親クラスと子クラスを用いた基本的な構造を再確認しましょう。
public class Animal {
String name;
void move() {
System.out.println(name + "が動いています。");
}
}
public class Cat extends Animal {
void meow() {
System.out.println("ニャー");
}
}
public class Main {
public static void main(String[] args) {
Cat cat = new Cat();
cat.name = "ミケ";
cat.move(); // 親クラスのメソッド
cat.meow(); // 子クラスのメソッド
}
}
上記のように、Javaの継承を活用すれば、プログラムが読みやすくなり、変更にも強くなります。実際に手を動かして、自分なりの親クラス・子クラスを作る練習を重ねていきましょう。
生徒
「親クラスの機能をそのまま子クラスで使えるって、すごく便利ですね!コードがすっきりしました。」
先生
「そのとおり。継承を使えば、共通する動きは一箇所にまとめて、あとから変更もしやすくなるんだよ。」
生徒
「でも、同じ名前の変数を親にも子にも書くと混乱しちゃいました……。」
先生
「よく気づいたね。そこは初心者がよくつまずくポイントだから、まずは親の機能をそのまま使うスタイルから覚えるといいよ。」
生徒
「次はもっとたくさんの動物クラスを作って、オリジナルの継承関係を考えてみたいです!」
先生
「いいね!まずは手を動かして、共通点と違いをしっかり見極める練習から始めよう。」