Javaは「抽象クラス」で実装を上手に再利用できる:【改訂版】Eclipseではじめるプログラミング(15)(1/3 ページ)
これからプログラミングを学習したい方、Javaは難しそうでとっつきづらいという方のためのJavaプログラミング超入門連載です。最新のEclipse 3.4とJava 6を使い大幅に情報量を増やした、連載「Eclipseではじめるプログラミング」の改訂版となります
インターフェイスとクラスの中間のようなもの?
これまでの連載で、インターフェイスやクラスについて理解しました。インターフェイスは具体的な処理が書かれていないメソッドの型だけを宣言している、特別なクラスのようなものでした。インターフェイスを実装するクラスを用意すれば、プログラムの実装を簡単に変更できました。
ここで、Javaには「抽象クラス」という「インターフェイスとクラスの中間のようなもの」もあります。あるインターフェイスを実装するクラスで、すべてのクラスがまったく同じメソッドの実装を持つ必要がある場合は、抽象クラスを使った方がいいときがあります。
今回は、この抽象クラスについて説明します。現時点では、何がなんだかよく分からないと思いますが、コードを丁寧に見ていくことで、その便利さが理解できると思いますので、がんばりましょう。
EclipseでJavaプログラミングを始める準備がまだの方は、連載第1回の「Eclipse 3.4で超簡単Javaプログラミング基礎入門」で準備をしておいてください。
「抽象クラス」とは 「abstract」とは
Javaには、抽象クラスというクラスがあります。
抽象クラスを使える3つの場面
このクラスは、以下の3つの場面で使えます。
- あるインターフェイスを実装するクラスを複数作成したところ、どのクラスにも共通の実装が必要なことが分かって、コードを共有化したい
- クラスが実装するべきインターフェイスは決まっていて、一部については実装方法も決まっているが、全部の実装方法までは決まっていない
- 既存のクラスに、あるインターフェイスを実装することにして、基本クラスとして使いたい
要するに、抽象クラスとは、「インターフェイスとクラスの中間のようなもの」で、基本的な処理の実装はできているが一部の処理はサブクラスが実装するようにさせたい場合に使います。
「abstract」キーワードと「具象クラス」
文法的には、「abstract」というキーワードを使います。このキーワードは、クラス宣言とメソッド宣言宣言で指定できます。abstractの意味は「抽象的な」です。これを指定したクラスは「抽象クラス」に、メソッドは「抽象メソッド」となります。指定方法は簡単で、クラス宣言やメソッド宣言時に、abstract修飾子を追加するだけです。
抽象クラスに対して、これまでの連載で出てきた、完全に実装されたクラスは「具象クラス(concrete class)」といわれています。
まずは、Eclipseで抽象クラスとサブクラスを試してみよう
実際に抽象クラス/メソッドの指定方法を見てみましょう。最後にダウンロードできるサンプルを見れば一目瞭然ですから、「void simpleMethod()」という抽象メソッドを1つだけ持つクラス「SimpleAbstractClass」を作成してみます。抽象メソッドを持つので、このクラスは抽象クラスとして宣言することになります。
Eclipseで抽象クラスを宣言
ここでは、「sample15.simple」パッケージのクラスとしています。ちなみに、Eclipseでは、下記のような手順で抽象クラスを自動生成できます。
- [ファイル]→[新規作成]→[クラス]を指定
- [パッケージ]に「sample15.simple」と入力
- [名前]に「SimpleAbstractClass」と入力
- [修飾子]として「public」を選択し、[abstract]をチェック
- [どのスタブメソッドを作成しますか?]で[継承された抽象メソッド]だけチェック
- [終了]ボタンをクリック
以上の操作で、抽象クラスSimpleAbstractClassの基本コードが生成されるので、そこへ抽象メソッドを追加します。下記は、具体的なコードです。
package sample15.simple; public abstract class SimpleAbstractClass { abstract void simpleMethod(); }
abstractキーワードがクラス宣言の前に付き、メソッドの宣言前にも付きます。
また、抽象メソッドでは、メソッドの具体的な処理が書かれていない点に注目をしてください。インターフェイスで宣言したメソッドと同じです。抽象クラスでは、抽象メソッドを持つことだけ宣言します。
実装は、この抽象クラスを「extends」(拡張)するサブクラスで記述します。
コラム 「抽象クラスはインターフェイスそっくりだ」
上記の抽象クラスは実装を持たないので、「インターフェイスとそっくりだ」と思った読者も多いのではないでしょうか。
確かに、抽象メソッドしか持たない抽象クラスはインターフェイスのようなものです。ただし、「あるクラスに複数のインターフェイスをimplementsできる」のに対して、「あるクラスは1つの抽象クラスをextendsすることしかできない」という特徴があります。
ここでは、サンプルとして単純なものを紹介しましたが、抽象メソッドしか持たないものについては、インターフェイスとして作成するのが普通です。
なお、インターフェイスのメソッドでは、暗黙のうちにabstractキーワードがメソッドの前に付いています。「インターフェイスのメソッドは、必ず抽象メソッドとなる」ので、abstractを付けずに省略できるのです。
Eclipseで抽象クラスをextendsするサブクラスを作成
それでは、抽象クラスをextendsするサブクラスSimpleConcreteClassを作成してみましょう。Eclipseでは、次の手順で作成できます。
- [ファイル]→[新規作成]→[クラス]を指定
- [パッケージ]に「sample15.simple」と入力
- [名前]に「SimpleConcreteClass」と入力
- [スーパークラス]に「sample15.simple.SimpleAbstractClass」を指定
- [修飾子]として[public]を選択
- [どのスタブメソッドを作成しますか?]で[継承された抽象メソッド]だけチェック
- [終了]ボタンをクリック
このように作成すると、抽象メソッドを実装する単純なコードを含むクラスが生成されます。生成されたコードを次のように編集して保存します。
ここでは、「simpleMethod()」の処理として、「SimpleConcreteClass」という文字列を出力する実装をしています。
package sample15.simple; public class SimpleConcreteClass extends SimpleAbstractClass { @Override void simpleMethod() { System.out.println("SimpleConcreteClass"); } }
次ページで、これを起動するクラスAppを作成して、実行してみましょう。そして、JavaのAPIで「抽象クラスが、なぜ便利なのか」をひも解きます。
Copyright © ITmedia, Inc. All Rights Reserved.