クラスを拡張する方法
1.2 クラスを拡張する方法
実際のソースコードでどのように記述すれば、拡張したクラスを作成できるのか説明していきます。
1.2.1 クラスを拡張する方法について
まずはクラスを拡張する基本構文を以下に示します。
クラスを拡張する方法はそれほど難しくありません。凡例を見ても分かるように新しいクラス名の横に「extends継承元のクラス名」と記述すれば、これだけでNotePcクラスを拡張しComputeクラスの機能全てを受け継ぐこと(継承)が可能になります。後はComputerクラスにはない、NotePcクラスに必要なメンバを記述すればよいです。
拡張を行ったことで若干記述方法に制約がつく場合と、スーパークラスを扱う仕組みが増えてはいますが、基本的なクラスの定義方法はこれまで学習してきた方法と変わりありません。制約がつく場合とスーパークラスを扱う仕組みについては後程解説を行っていきます。
ポイント
- クラスの宣言時にクラスを拡張しスーパークラスを指定することができる。作られたクラスはサブクラスとなり、スーパークラスのメンバを継承する。
それでは実際に既存のクラスを拡張して新しいクラスを作成したプログラムを紹介していきます。
1.2.2 既存のクラスの機能を継承した新しいクラスを作成する
既存のクラス「Computer1」の機能を継承した新しいクラス「NotePc1」を作成します。クラスを拡張する方法について学習しましょう。
➢ Computer1.java ※スーパークラス① ソース・フォルダー :myproj_basic/src
② パッケージ :jp.co.f1.basic.ch11
③ 名前 :Computer1
package jp.co.f1.basic.ch11; public class Computer1 { private String os; private int memory; //コンストラクタ(引数なし) public Computer1(){ this.os = null; this.memory = 0; System.out.println("パソコンを作成しました。"); } //コンストラクタ(引数あり) public Computer1(String os, int memory){ this.os = os; this.memory = memory; System.out.println("OS「" + os + "」メモリサイズ「" + memory + "MByte」のパソコンを作成しました。"); } public void setOsMemory(String os,int memory){ this.os = os; this.memory = memory; System.out.println("OSを「" + os + "」にメモリを「" + memory + "MByte」に変更しました。"); } public void show(){ System.out.println("パソコンのOSは「" + os + "」です。"); System.out.println("メモリサイズは「" + memory + "MByte」です。"); } }
➢ NotePc1.java ※サブクラス① ソース・フォルダー :myproj_basic/src
② パッケージ :jp.co.f1.basic.ch11
③ 名前 :NotePc1
package jp.co.f1.basic.ch11; //Computer1クラスを継承 public class NotePc1 extends Computer1 { private String useType; // 用途タイプ public NotePc1() { this.useType = null; System.out.println("ノートパソコンを作成しました。"); } public void setUseType(String useType) { this.useType = useType; System.out.println("タイプは" + this.useType + "用にしました。"); } }
実行結果
既存のクラスの機能を継承した新しいクラスを定義しただけの為、実行結果は無し
解説
継承もとのComputer1クラスはスーパークラスとなり、NotePc1クラスは、Computer1クラスの機能を継承したサブクラスになります。
4行目のクラス名の横に「extends Computer1」と記述することでComputer1クラスを拡張しています。
5行目にはこのクラスで利用する、フィールド変数useTypeを文字列型で定義しています。
7~10行目はこのクラスのコンストラクタを定義しています。
11~14行目ではインスタンスメソッドのsetUseTypeメソッドを定義しています。
4行目のクラス名NotePc1の横に拡張する為の宣言があるだけで、クラスの定義方法は変わっていないことが確認できます。これでComputer1クラスの機能を継承したNotePc1クラスが作成できたことになります。
図 1.2.1: クラスの拡張と継承
次項で拡張して定義した新しいクラスから、継承した機能や自身の機能を利用したプログラムを紹介します。
1.2.3 サブクラスのオブジェクトを作成して利用するプログラム
拡張して作成したサブクラスをオブジェクト化して、継承した機能と独自の機能を利用して動作することを確認します。
ソースコード
➢ Computer1.java ※スーパークラス1.2.1で作成したクラスを利用します。
➢ NotePc1.java ※サブクラス1.2.1で作成したクラスを利用します。
➢ UseSubClass1.java ※mainメソッドを持つ実行クラス① ソース・フォルダー :myproj_basic/src
② パッケージ :jp.co.f1.basic.ch11
③ 名前 :UseSubClass1
④ 作成するメソッド・スタブの選択:public static void main(String[] args) にチェックを入れる
package jp.co.f1.basic.ch11; public class UseSubClass1 { public static void main(String[] args) { //サブクラスのオブジェクトを生成 NotePc1 npc = new NotePc1(); //スーパークラスのメンバ呼び出し npc.setOsMemory("WindowsXP", 1024); //サブクラスのメンバ呼び出し npc.setUseType("モバイル"); //スーパークラスのメンバ呼び出し npc.show(); } }
実行結果
解説
6行目でComputer1クラスの機能を継承したNotePc1クラスのオブジェクト化を行っています。
拡張したクラスであっても、これまで通りnew演算子を利用してオブジェクト生成できます。
9行目でスーパークラスのsetOsMemory()メソッドを呼び出して各パソコン情報の各値を設定しています。
12行目で拡張して追加した自身のsetUseType()メソッドを利用して用途タイプを設定しています。
15行目でスーパークラスのshow()メソッドを呼び出して、パソコン情報を表示しています。
実行結果からも分かるように、スーパークラスから継承したメソッドやサブクラスで拡張したメソッドを同じオブジェクトから呼び出せていることが確認できます。
図 1.2.2: サブクラスのオブジェクトを作成して利用するプログラムのクラス構成
ポイント
- サブクラスはスーパークラスのフィールドとメソッドを引き継ぎ、さらに機能を追加できる。
今回のプログラムの実行結果から気になる点があります。それは今回のプログラムではNotePc1クラスのオブジェクト化のみを行っているはずなのに、継承元のComputer1クラスのコンストラクタが呼び出されている点です。実はサブクラスのオブジェクト生成を行うと、スーパークラスのコンストラクタが自動で呼ばれる仕組みになっています。この仕組みの説明は次の節で改めて行いますので、このような仕組みがあることを覚えて次に進んで下さい。