
皆さんこんにちは新米です。
今回はJavaの継承について詳しく解説していきたいと思います。
継承は今後javaを使った開発では、絶対に欠かせない重要な知識となります。
またJava言語以外のオブジェクト言語でも継承はよく使われますのでこの機会に覚えましょう!

継承ってそもそもなんですか?

継承はオブジェクト指向の一つです。
これから詳しく話していきますね

よろしくお願いします!
そもそも継承とは?
継承はオブジェクト指向の1つですが、オブジェクト指向と言われても抽象的で難しいですよね💦
初めは理解できなくて大丈夫です。オブジェクト指向は以下の3つを表しますので、1つずつ学習し知識を深めていきましょう!
オブジェクト指向3大要素
・カプセル化
・ポリモーフィズム
継承とはあるクラスの機能を引き継いだクラスのことを言います。
例えば、クラスXの機能をクラスYも使えるイメージです。
・引き継ぎ先のクラスをサブクラス(子クラス)
と言われることが多いです。
ではなぜ、スーパークラスを継承するかについて説明したいと思います。
継承をするメリット
実際に継承を使用しなくてもプログラミングを行うことは可能です。
しかし継承を使うのは以下のメリットがある為です。
・拡張性
大規模なプログラミング開発になっていくとコードもたくさん書くことになります。
その時、似たような機能があった場合、重複したコードを書かないようにする為です。
重複したコードを何回も書いてしまうとコードが見づらくなり、思わぬバグが起きる原因にもなります。
またメンテナンスも難しくなってしまい「機能の新規追加」や「バグ問題の修正」などが困難になります。
初心者のうちはコードを色々書いてみて覚えることは重要ですが、プログラマーにとっては効率よく少ないコードで簡潔にまとめることが重要視されています。

何となくはわかったけど、まだ完全には理解できてないです💦

安心して!今からイラストでよりわかりやすく説明します!
継承を使う場合は、複数のサブクラスに共通する機能があった際に、1つのスーパークラスに定義して継承するのが一般的です。
例えば、「肉食動物」と言うスーパークラスを作ってサブクラスが継承するイメージです。
新しく「恐竜クラス」を作りたい場合はクラスを作りスーパークラスを継承すればいいだけです!
共通部分は一つにまとめて再利用可能にし、何度も同じようなプログラムを書く必要がなく、作業の効率化、ソースコード全体を見やすくさせることができます。

骨組みとなるクラスを先に作って継承することでコードの短縮化が可能でコードの再利用もできるんだ!!

その通りです!
スーパークラスには共通する最低限の機能を定義しましょう。
継承の定義方法
サブクラスを定義する際には「extends」キーワードを使用します。
例)class Sub extends Super
Java言語では、クラス定義時のextendsキーワードの後に指定できるクラスは1つだけです。
つまり継承できるスーパークラスは1つだけです。
また、あるクラスを元に定義したサブクラスから、さらにサブクラスを定義することも可能です。
継承の定義例
スーパークラスの定義例 class Super1 {} class Super2 {} サブクラスの定義例 ①class Sub1 extends Super1{} //OK ②class Sub2 extends Super1{} //OK ③class Sub2 extends Sub1{} //OK ④class Sub1 extends Super1,Super2{} //NG(コンパイルエラー)
①と②のように1つのクラスを元に複数のサブクラスを定義することは問題ありません。そうじゃないと継承の意味がありませんもんね(笑)
③はサブクラスを元に更にサブクラスを定義することも問題ありません。
④はコンパイルエラーです。複数のスーパークラスを継承することはできません。
実際に継承を書いてみよう!
[サンプルコード]class Animal{ private String name = "肉食動物"; public String getAnimal(){ return name; } } class Rion extends Animal{ private String name = "ライオン"; public String getName(){ return name; } } class Shark extends Animal{ private String name = "サメ"; public String getName(){ return name; } } public class Main { public static void main(String[] args) { Rion r = new Rion(); Shark s = new Shark(); System.out.println(r.getName() + "は" + r.getAnimal() + "です。"); System.out.println(s.getName() + "は" + s.getAnimal() + "です。"); } }
実行結果
ライオンは肉食動物です。
サメは肉食動物です。
コードの解説
1~6行目で定義したスーパークラス(Animal)を元に、7~12行目ではサブクラス(Rion)、13~18行目ではサブクラス(Shark)の定義をしています。
22・23行目ではサブクラスを、それぞれインスタンス化しています。
また、25・26行目では、サブクラスのオブジェクトに対してgetAnimal()メソッドを呼び出しています。
サブクラス自体にgetAnimal()メソッドは定義されていませんが、スーパークラスを継承している為、スーパークラスのgetAnimal()メソッドが呼び出し可能です。
まとめ
いかがだったでしょうか。
今回はJavaの継承について解説しました。
オブジェクト指向言語を学ぶうえで継承は必須です。必ず開発の場で使う時がありますので
まずは先程のサンプルコードのように簡単なコードを書いて継承の仕組みを理解していきましょう!
コメント
[…] ・継承 ・カプセル化 ←今回はカプセル化のみ学びます。 ・ポリモーフィズム […]
[…] ・継承 ・ポリモーフィズム ・カプセル化 […]