クラスの継承って何?といった初心者レベルの方からJavaでの継承の記述方法を知りたい方向けに、基本的な考え方や継承(extends)の使い方をご紹介したいと思います。
目次
Javaの継承(extends)ってなに?
オブジェクト指向のプログラミングで実装する際、頻繁に利用する「継承」という考え方についてまずご紹介していきます。
クラスの継承とは?
オブジェクト指向プログラミングで利用されるクラスの継承は、名前の通りクラスに定義された情報(フィールドやメソッド)を他のクラスに引き継ぐことが出来るものです。
継承させることのメリットは?
継承させることのメリットは、複数のクラスに共通のコードを何度も記述する必要がなくなり、可読性が上がります。
また、共通のフィールドや機能を追加したい場合にも継承元のクラスに追加すれば、継承後の全てのクラスに反映されるため、全てのクラスに同じコードを追加する必要がなく、効率的で可読性の高いコードを実装することが可能になります。
Javaで継承を利用するには?
Javaで継承を利用するには継承先のクラス名の後ろに「extends」を記述し、継承元のクラス名を指定します。
Javaの継承(extends)をサンプルコードで確認
ここからはJavaの継承(extends)をサンプルコードを掲載しながらご紹介していきます。
継承元のクラスにあるフィールドを継承先から呼び出してみよう
まずは継承元となる「PC」クラスを元に「Laptop」クラスを作成するサンプルコードを記述してみます。
import java.util.*; public class Main { public static void main(String[] args) throws Exception { Laptop laptop = new Laptop(); laptop.cpu = "core-i7"; laptop.memory = "16GB"; laptop.displaySize = 13.4; System.out.println("CPUは" + laptop.cpu); System.out.println("memoryは" + laptop.memory); System.out.println("画面サイズは" + laptop.displaySize); } } class PC { String cpu; String memory; } class Laptop extends PC { double displaySize; }
サンプルコードを実行した結果が下記の通りとなります。
CPUはcore-i7 memoryは16GB 画面サイズは13.4
サンプルコードでは、「PC」クラスを継承したサブクラスの「Laptop」で継承元にしか記述していない「cpu」「memory」のフィールドを呼び出せていることがご確認頂けると思います。
Javaでは継承出来るクラスは1つだけ
継承クラスでは1つだけしか継承元のクラスを定義することは出来ません。
下記のような記述方法はコンパイルエラーとなります。
class GamingLaptop extends PC, Laptop { }
「extends」の後ろに定義出来る継承元クラスは1つだけとJavaの仕様で決まっています。
一方、下記のようにいずれかのクラスを継承しているクラスを更に継承することは可能です。
import java.util.*; public class Main { public static void main(String[] args) throws Exception { GamingLaptop laptop = new GamingLaptop(); laptop.cpu = "core-i7"; laptop.memory = "16GB"; laptop.displaySize = 13.4; laptop.gpu = "GTX1060"; System.out.println("CPUは" + laptop.cpu); System.out.println("memoryは" + laptop.memory); System.out.println("画面サイズは" + laptop.displaySize); System.out.println("GPUは" + laptop.gpu); } } class PC { String cpu; String memory; } class Laptop extends PC { double displaySize; } class GamingLaptop extends Laptop { String gpu; }
サンプルコードを実行した結果は下記の通りとなります。
CPUはcore-i7 memoryは16GB 画面サイズは13.4 GPUはGTX1060
「PC」クラスを継承元とした「Laptop」クラスを作成し、更に「Laptop」クラスを継承させて「GamingLaptop」を作成することで、「GamingLaptop」クラスで「PC」クラスに定義したフィールドやメソッドを利用することが可能になります。
Javaの継承(extends)を応用して基幹クラスのメソッドを上書き
ここからは少し応用的な実装方法について「extends」の使い方をご紹介していきます。
継承元で定義されたメソッドの処理は上書きできる
継承の応用的な使い方として継承元で定義されたメソッドを上書きして利用する方法についてもご紹介しておきましょう。
import java.util.*; public class Main { public static void main(String[] args) throws Exception { Laptop laptop = new Laptop(); laptop.sleepMode = true; laptop.turnOn(); System.out.println("現在電源の状態は" + laptop.powerState); laptop.turnOff(); System.out.println("現在電源の状態は" + laptop.powerState); laptop.sleepMode = false; laptop.turnOff(); System.out.println("現在電源の状態は" + laptop.powerState); } } class PC { String powerState; String cpu; String memory; void turnOn() { powerState = "ON"; } void turnOff() { powerState = "OFF"; } } class Laptop extends PC { boolean sleepMode; double displaySize; ※1 void turnOff() { if(sleepMode) { powerState = "SLEEP"; } else { super.turnOff(); ※2 } } }
サンプルコードを実行した結果が下記となります。
現在電源の状態はON 現在電源の状態はSLEEP 現在電源の状態はOFF
処理の内容としては、「PC」に定義されている電源状態「powerState」が「Laptop」クラスではスリープモードを加えて切り替えられるように実装されています。
「Laptop」クラスで「turnOff」メソッドを呼び出した際は、※1のメソッドが呼ばれる形になり「sleepMode」の状態で処理を切り分けています。
元々「PC」クラスでは「turnOff」メソッドは電源状態を「OFF」にすることだけの機能でしたが「Laptop」クラスでは電源状態を「SLEEP」 に設定出来るように上書きしており、「オーバーライド」と呼ばれるJavaの機能となります。
また注目してもらいたいのが、※2の行で「super.メソッド名」と記述しています。
「super」を使用することで、継承元で定義されていたメソッドをそのまま利用することも可能な点が、継承クラスの特徴です。
さいごに:Javaで継承(extends)の理解はオブジェクト指向の理解に繋がる
本記事では、Javaでクラスを継承させる際に利用する、「extends」の基本的な使い方と応用方法についてご紹介してきました。
クラスの継承を理解することはJavaに限らずオブジェクト指向のプログラミング言語を理解するのに非常に重要な役割を果たします。
ぜひ今回ご紹介した内容をしっかりと理解して、オブジェクト指向プログラミングをより効率的に実装できるスキルを身につけましょう。
非常に簡単に実装出来る上に、透明性の高いコードを実装することが可能となります。