.net column
.NET開発者のためのブログメディア

Javaでabstractを使うには?抽象クラスの扱い方をご紹介!

 
Javaでabstractを使うには?抽象クラスの扱い方をご紹介!
SE
Javaのabstractをまだうまく使いこなせません。
PM
初心者のうちは、難しく感じるかもしれませんが、abstractを使いこなすために少し詳しく解説いたしましょう。

Javaのabstractとは?


Javaの初心者はabstractという修飾子についてよくわからない人もいるでしょう。abstractは抽象クラスを作るために必要なJavaの機能です。抽象クラスはその名の通り抽象的で、難しそうに感じるかもしれません。

しかしここでは難しいお話は避けて、とりあえずabstractを便利に活用することを目的に解説します。abstractで出来る事について知りたい人は是非ご覧ください。

抽象クラスと抽象メソッドとは

抽象クラスと抽象メソッドは返り値と引数だけをあらかじめ定義するためのものです。abstractによる定義はいわば設計書の様なもので、継承したクラスで処理を実装することを目的としています。

Javaはオブジェクト指向言語の一種であり、オブジェクト指向にならった開発をするにあたって抽象化と継承は非常に大切な概念です。

具体的な用途としては同じメソッド名として定義したいものの、継承するクラスによって実装が変わる場合に有用です。

抽象クラスの書き方例4つ

まずは実例を見てみましょう。abstractによる抽象クラスの書き方についてJavaコードによる実例を4つ挙げます。まずは簡単な例として返却値を持たないvoidな抽象メソッドの実装の仕方について紹介します。

1:abstractでvoidなメソッドを定義する

以下のサンプルをご覧ください。Bookクラスのreadメソッドとshow_infoメソッドがabstract修飾子によって定義されています。void句があるため返却値を持たない抽象メソッドになります。

2:抽象クラスでメソッドの記述を強制する

抽象クラスはなぜ必要なのでしょうか。抽象クラスは「このメソッドは子クラスに必ず記述して欲しい」という時に使用します。

このJavaサンプルの場合、本のクラスは必ずreadメソッドとshow_infoメソッドをオーバーライドして記述して欲しいという意図があります。

必ず記述することで具体的にどのように役に立つのでしょうか。それを解説するので、まずここまでのJavaサンプルに以下を追加しましょう。

3:抽象クラスを親に持つ抽象クラス

以下のJavaサンプルのように、抽象クラスを親に持つ抽象クラスを作ることもできます。抽象クラスであれば、親クラスの抽象メソッドは子クラスでも抽象メソッドとすることが可能です。

このサンプルの場合、Bookクラスを修正せずに機能を追加したい時には便利でしょう。

4:サブクラスが具象クラス

具象クラスとはすべてが定義されたクラスのことを指します。要するに抽象メソッドを持たないクラスのことです。

そしてサブクラスとは抽象クラスを継承したクラスのことを指します。サブクラスは継承元のクラスで定義された中小メソッドすべてを実装しなければなりません。

抽象クラスを使う上での3つの注意点

以上抽象クラスと抽象メソッドの4つの使い方について解説いたしました。抽象クラスと抽象メソッドを使うことで実装せずに定義することを学び、さらに継承したサブクラスは実装しなければならないということを学びました。

次に抽象クラスを使う上で気を付けなければならない3つの注意点について紹介いたします。

1:抽象クラスはインスタンス化できない

abstractの抽象メソッドが1つでもあるクラスは、クラス宣言でabstract classとして抽象クラスにする必要がありますそして抽象クラスはnewでインスタンス化ができません。

このJavaサンプルの場合、上記のようにしてもエラーになります。抽象クラスというのは子クラスのベースとしてとして使われるものだからです。

ただし下記のようであれば大丈夫です。

2:抽象メソッドはすべてオーバーライドが必要

今までのJavaサンプルでは、Bookクラスを継承してComicクラスが作られています。Bookクラスには3つのメソッドがありますが、そのうちreadとshow_infoにはabstractがついていて、中身がありません。これを抽象メソッドと言います。

親クラスを継承(extends)した子クラスは、親クラスの抽象メソッドを必ず同じ名前で全て記述する必要があります。仮にComicにreadやshow_infoが無いと、エラーになるのです。

@Overrideはとても便利

Comicクラスのreadやshow_infoのように、親クラスと同じ名前のメソッドを記述することをオーバーライドと言います。それぞれに@Overrideがついていますが、これはアノテーションと言って、この場合はオーバーライドのメソッドであることがわかります。

@Overrideは必須ではありませんが、これがついていると、もしメソッドの名前を間違えた場合は「そのようなメソッドは親クラスにありませんよ」と警告を出してくれます。オーバーライドの間違いが防げるのでとても便利です。

3:サブクラスでコンストラクタの記述が必要

Javaでは抽象クラスを継承したサブクラス自体にもコンストラクタの記述が必要です。継承されるのはあくまで抽象クラスで定義したメソッドであり、コンストラクタ自体は継承されません。

Javaにおけるコンストラクタの実行順序ですが、継承元となる抽象クラスのコンストラクタが先に実行され、そのあとサブクラスのコンストラクタが実行されます。

抽象クラスとインターフェイスの比較3つ

ここまで抽象クラスの使い方と注意点について学びました。次に抽象クラスと似た機能を持つインターフェイスとの比較を見ていきましょう。

まず、そもそもインターフェイスとの違いは何かについて説明いたします。その次に抽象クラスを置き換えた場合の表記について紹介し、最後にどちらを使うべきかについてまとめます。

1:抽象クラスとインターフェイスの違いは?

Javaには抽象クラスに似た機能でインターフェイス(interface)があります。インターフェイスは抽象クラスと違い、全てのメソッドを抽象メソッドにする必要があります。ただしJava8からはdefault修飾子で普通に処理を記述できるようになりました。

さらにインターフェイスは抽象クラスと比較して、メソッドは全てpublicのみ、フィールドは全てpublic static finalの定数扱いになる、抽象クラスと違っていくつでも親クラスとして持てるという違いがあります。

なお正確にはインターフェイスは親クラスに持つとは言わず、実装(implements)すると言います。

2:抽象クラスをインターフェイスに置き換えると?

ここまでのJavaサンプルを抽象クラスではなくインターフェイスで書き換えると以下のようになります。

3:どちらを使うべき?

mainメソッドはそのままで同じように動作します。このことからも抽象クラスとインターフェイスがとても似ていることがわかるでしょう。

では抽象クラスとインターフェイス、どちらを使用した方がよいのでしょうか。答えは、インターフェイスです。抽象クラスは1つしか親に持てませんが、インターフェイスはいくつでも実装できるという点が大きいですね。

Java8以前のインターフェイスはdefaultが無かったので、抽象クラスは普通の処理も記述できるというメリットがあったのですが、defaultが導入されたのでその差もなくなりました。

SE
抽象クラスとインターフェイスの違いや置き換え方などよくわかりました。
PM
Javaのスキルを高めるためにも抽象クラスの考え方を理解することはとても重要です。

抽象クラスの概念を知ってJavaのスキルを高めよう

Javaのabstructによる抽象クラスの使い方を解説しましたが、ご理解できましたでしょうか。

抽象クラスよりインターフェイスを使う方が望ましいのですが、抽象クラスの考え方を理解するためにも抽象クラスを是非使ってみましょう。使用することでオブジェクト指向プログラミングのスキルが高まるのは間違いないでしょう。


.NET分野でのキャリアアップをお考えの方は、現在募集中の求人情報をご覧ください。

また、直接のエントリーも受け付けております。

エントリー(応募フォーム)

Search

Popular

reccomended

Categories

Tags