【Java入門】継承(extends)について – 複数はNGです

Java入門_継承Java入門
スポンサーリンク

こんにちは!しーま(@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という文字列が出力されていることが分かります。

ここで、注目する点は、クラスAcalcメソッドを定義していないにも関わらず、処理を呼び出せたり・実行できたりするという事です。

継承の仕組みを理解できたらプログラミングがもっと楽に・合理的に作成することが出来ます♪

業界初!9,800円のサブスク型プログラミングスクール【Freeks フリークス】

継承の注意点

ここまで継承に良い点や使い方について解説しました。

ただし、使う場合は下記の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つ

  1. 変数が持つ役割が異なる場合、スーパークラス 又は サブクラスのどちらかの変数名を変更
  2. 変数が持つ役割が同じである場合、スーパークラスの変数を継承し、サブクラスでも使用

継承するクラスを作成する場合、上記の2点を意識して取り組んでみてくださいね。

これで継承(extends)についての解説を終わります。

エンジニアのための転職エージェントサービス【Tech Stars Agent】

関連記事

おすすめ記事

Javaプログラミングをもう一度本格的に勉強したいっ!」という方へ

逆に、「Javaプログラミング以外を本格的に勉強したいっ!」という方へ

IT系フリーランス専門エージェントサービス第1位のMidWorksは業界トップクラスの低マージンで多くのエンジニアから選ばれています!!

Javaスキルで悩んでいる方必見!本気で学習できる環境を探してみよう!
詳細はこちら
Javaスキルで悩んでいる方必見!本気で学習できる環境を探してみよう!
詳細はこちら
タイトルとURLをコピーしました