今回は「継承」について説明します。
継承とは
Javaでは、既存のクラスを基に拡張し、新たなクラスを作成することできます。
その新しいクラスでは、既存のクラスのメンバ(クラス直下にある変数やメソッド)を使用することができます。
これを「継承」といいます。
また、基となる既存のクラスのことを「スーパークラス(親クラス)」、新規のメンバを受け継いだクラスを「サブクラス(子クラス)」と呼びます。
イメージでは以下のようになります。
この図ではスーパークラスが「動物」、サブクラスが「犬」、「猫」にあたります。
つまり動物クラスにあるメンバは犬クラスや猫クラスでも共通して使用することができます。
例えば、動物クラスに「鳴く」や「歩く」といった操作が定義されていたとします。
すると、サブクラスでは定義しなくても「名前」や「鳴く」といった変数やメソッドが使うことができるようになるのです。
また、サブクラスで新たに変数やメソッドを定義することもできますし、サブクラスからサブクラスを作成することも可能です。
この「継承」でクラスを拡張して使います。
サブクラスを作成する構文は以下の通りとなります。
[修飾子] class サブクラス名 extends スーパークラス名 { }
まず通常通りクラスの宣言を行い、その後ろに「extends」キーワード。さらに後ろにスーパークラスを指定します。
では上の図を例にサブクラスを作成してみましょう。
まず動物クラスを「Animal」、犬クラスを「Dogs」、猫クラスを「Cats」だとします。
まず犬クラス
class Dogs extends Animal {}
続いて猫クラス
class Cats extends Animal {}
以上の様になります。
では今度はプログラムの例をみてみましょう。
サンプルプログラム
class Animal { String name; //インスタンス変数 String voice; //インスタンス変数 Animal(){ コンストラクタ System.out.println("動物を登録しました"); } public void setAnimal(String n, String v) { name = n; //引数の値をnameに代入 voice = v; //引数の値をvoiceに代入 } public void getAnimal() { System.out.println("名前は" + name + "で、" + voice + "と鳴きます。"); } } class Dogs extends Animal { //Animalクラスを継承したサブクラスを作成 Dogs() { //コンストラクタ System.out.println("犬が登録されました"); } } public class Sample11_1 { public static void main(String[] args) { Dogs d1 = new Dogs(); //Dogsクラスをインスタンス化 d1.setAnimal("ポチ", "わんわん"); //引数を指定 d1.getAnimal(); } }
このサンプルを実行すると、
動物を登録しました。
犬が登録されました
名前はポチで、わんわんと鳴きます。
と表示されます。
では解説していきましょう。
サンプルプログラム解説
注目すべきはSample11_1クラスです。
24行目で、サブクラスであるDogsクラスがインスタンス化されています。
ここがポイントです。
サブクラスがインスタンス化されると、コンストラクタが呼ばれます。
しかし、実行結果の1,2行をみてみると、
「動物を登録しました」→Animalクラスのコンストラクタ
「犬が登録されました」→Dogsクラスのコンストラクタ
以上の結果になっています。
Dogsクラスをインスタンス化したのに、先にAnimalクラスのコンストラクタが呼ばれていますね。
実はサブクラスのコンストラクタの前に、スーパークラスがのコンストラクタが呼ばれるのです。
すると実行結果のような順番になるのです。
まとめ
今回は継承について説明しました。
ポイントは
- サブクラスではスーパークラスのメンバを使用することが出来る
- その機能をしてクラスを拡張することが可能
- サブクラスがインスタンス化されると、まずスーパークラスのコンストラクタが呼ばれる
ということです。
次回はオーバーロードについて説明します。