こんにちは!しーま(@s59shima)です。
いつもブログをご覧いただきありがとうございます。
今回は、こんな悩みや疑問のある方に向けて記事を書きました。

正直、継承の使い方・特徴について理解してないかも。
継承を使用する際、注意することある!?
オブジェクト指向3大要素の一つである、継承について知りたい方にはおすすめの記事です。
- 継承(extends)の特徴について
- 継承の活用方法について
- 継承の注意点について
継承(extends)の特徴
Javaにはクラスの継承(extends)という方法があります。
それによって、既存のクラスを基に新しいクラスを作成することができます。
とても便利ですよね。つまり、、、流用できるという事です。
余談ですが、継承・ポリモーフィズム・カプセル化はオブジェト指向の3大要素になります。
継承の使い所
例えばクラスA・B・Cが既に作成されていたとします。
そして、クラスA・B・Cには、たまたま共通した処理【計算する】があったと仮定します。

その場合、共通した部分【計算する】を丸ごと別クラスに引っ越して、それを継承してあげれば良いのです。

そうすることで、似たような処理(重複)を排除し、新たに作成するクラスDでも流用可能となるのです。

一般的に、共通クラスのことをスーパークラスと呼び、それを継承したクラスをサブクラスと呼ばれます。
上記の図だと、クラス X がスーパークラス、クラスA~Dがサブクラスになります。
継承の活用方法
継承の書き方です。

extendsキーワードを使用することで継承を実現できます。
例えば、先ほどのクラス関係(クラスXとクラスAを例に)を基に書式に当てはめてみましょう。
クラスXを継承したクラスAの場合は、下記のような書き方になります。


ここで、継承について説明を深掘りします。
クラスXは計算する(calc)という処理(メソッド)を持っています。
なので、クラスAはクラスXを継承した場合、計算する(calc)という処理を書かなくても使用することが可能なのです。
そして出力する(output)という処理(メソッド)を+αとして改良することが出来るのです。
実際にJavaプログラムを作成して、実行をしてみましょう。
以下、簡単な文字列を出力するサンプルコードです。
まずはクラスXです。calcというメソッドを定義します。
public class X {
public static void calc() {
System.out.println("calc");
}
}
次に、クラスAです。exntendsキーワードを使用してクラスXを継承しています。
そしてプログラム実行に必要な処理(mainメソッド)を書いてプログラムを実行します。
public class A extends X {
public static void out() {
System.out.println("out");
}
public static void main(String[] args) {
calc();
out();
}
}
実行結果は、下記のようになります。
calc
out
calcとoutという文字列が出力されていることが分かります。
ここで、注目する点は、クラスAにcalcメソッドを定義していないにも関わらず、処理を呼び出せたり・実行できたりするという事です。
継承の仕組みを理解できたらプログラミングがもっと楽に・合理的に作成することが出来ます♪
継承の注意点
ここまで継承に良い点や使い方について解説しました。
ただし、使う場合は下記の2つに注意する必要があります。
複数の指定はNG!
継承することでクラスが持つ変数やメソッドの重複を排除し、クラスを改良することができました。
そのため、複数のクラスを継承して、多くの機能を実現できるっと思ってしまいませんか???
ただし、継承できるクラスは「1つ」と決まっているのです!!!

複数のクラスを継承してしまうと、構文エラーとなり、プログラムを実行すら出来ません。
なので、作成したソースファイルをコンパイル時に間違いに気が付くと思います。IDE(統合開発環境)を使用していれば、コーディング時にエラー表示してくれます。
同じ変数名だと可読性ダウン!
スーパークラス(継承される側)とサブクラス(継承する側)の両方で同じ変数名を定義することができます。
ちょっとここで質問です。
以下、サンプルコードの実行結果はどうなるか分かりますか!?少し考えてみてください。
public class X {
public static String message = "X";
}
public class A extends X {
public static String message = "A";
public static void main(String[] args) {
System.out.println( message );
}
}
実行結果は「A」になります。
変数messageはスーパークラス・サブクラス両方に存在します。
その場合、サブクラスが優先になるためです。
ただ、これだと、どちらを使用しているのか曖昧になってしまい、意図しない動きに繋がる可能性があります。
可読性を考慮すると、避けたほうが良いです。
解決策は2つ
- 変数が持つ役割が異なる場合、スーパークラス 又は サブクラスのどちらかの変数名を変更
- 変数が持つ役割が同じである場合、スーパークラスの変数を継承し、サブクラスでも使用
継承するクラスを作成する場合、上記の2点を意識して取り組んでみてくださいね。
これで継承(extends)についての解説を終わります。
関連記事
Javaが学べるスクールを徹底比較
スクール名 | Tech Academy | Raise Tech |
コース名 | Javaコース | Javaフルコース |
受講形式 | オンライン | オンライン |
受講期間 | 8週間プラン 12週間プラン 16週間プラン | 16週間 |
受講料金 | ¥179,000~ ¥209,000~ ¥239,000~ | \398,000~ |
入学金 | ¥0 | – |
無料体験・説明会 | あり | あり |
サポート体制 | チャットサポート(毎日15時〜23時) マンツーマンメンタリング(1回30分の週2回) 課題レビュー(回数無制限) | チャットサポート(毎日10時~24時) 授業回数(全16回 週1回 / 1回あたり120分) |
特徴 | オンライン完結のため、全国各地から受講可能 学生だと受講料金が割引に | オンライン完結のため、全国各地から受講可能 学生だと受講料金が割引に 2週間のトライアル受講あり |
公式サイト | 詳細はこちら | 詳細はこちら |