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

- システム
エンジニア - Javaのabstractをまだうまく使いこなせません。
- プロジェクト
マネージャー - 初心者のうちは、難しく感じるかもしれませんが、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句があるため返却値を持たない抽象メソッドになります。
1
2
3
4
5
6
7
8
9
10
|
abstract class Book {
public abstract void read();
public abstract void show_info();
public void remove() {
System.out.println(“この本を削除します。”);
}
}
|
2:抽象クラスでメソッドの記述を強制する
抽象クラスはなぜ必要なのでしょうか。抽象クラスは「このメソッドは子クラスに必ず記述して欲しい」という時に使用します。
このJavaサンプルの場合、本のクラスは必ずreadメソッドとshow_infoメソッドをオーバーライドして記述して欲しいという意図があります。
必ず記述することで具体的にどのように役に立つのでしょうか。それを解説するので、まずここまでのJavaサンプルに以下を追加しましょう。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
import java.util.*;
class Novel extends Book {
@Override
public void read() {
System.out.println(“小説を読みましょう。”);
}
@Override
public void show_info() {
System.out.println(“これは小説です。”);
}
}
public static void main(String[] args) {
ArrayList<Book> l = new ArrayList<Book>();
l.add(new Comic());
l.add(new Novel());
for(Book b : l) {
b.read();
}
}
|
3:抽象クラスを親に持つ抽象クラス
以下のJavaサンプルのように、抽象クラスを親に持つ抽象クラスを作ることもできます。抽象クラスであれば、親クラスの抽象メソッドは子クラスでも抽象メソッドとすることが可能です。
1
2
3
4
5
6
7
8
9
10
11
|
abstract class EBook extends Book {
public abstract void read();
public abstract void show_info();
public void download() {
System.out.println(“電子書籍をダウンロードします。”);
}
}
|
このサンプルの場合、Bookクラスを修正せずに機能を追加したい時には便利でしょう。
4:サブクラスが具象クラス
具象クラスとはすべてが定義されたクラスのことを指します。要するに抽象メソッドを持たないクラスのことです。
そしてサブクラスとは抽象クラスを継承したクラスのことを指します。サブクラスは継承元のクラスで定義された中小メソッドすべてを実装しなければなりません。
抽象クラスを使う上での3つの注意点
以上抽象クラスと抽象メソッドの4つの使い方について解説いたしました。抽象クラスと抽象メソッドを使うことで実装せずに定義することを学び、さらに継承したサブクラスは実装しなければならないということを学びました。
次に抽象クラスを使う上で気を付けなければならない3つの注意点について紹介いたします。
1:抽象クラスはインスタンス化できない
abstractの抽象メソッドが1つでもあるクラスは、クラス宣言でabstract classとして抽象クラスにする必要がありますそして抽象クラスはnewでインスタンス化ができません。
1
2
3
|
Book b = new Book();
|
このJavaサンプルの場合、上記のようにしてもエラーになります。抽象クラスというのは子クラスのベースとしてとして使われるものだからです。
ただし下記のようであれば大丈夫です。
1
2
3
|
Book b = new Comic();
|
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サンプルを抽象クラスではなくインターフェイスで書き換えると以下のようになります。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
interface Book {
public void read();
public void show_info();
public default void remove() {
System.out.println(“この本を削除します。”);
}
}
class Comic implements Book {
@Override
public void read() {
System.out.println(“漫画を読みましょう。”);
}
@Override
public void show_info() {
System.out.println(“これは漫画です。”);
}
}
class Novel implements Book {
@Override
public void read() {
System.out.println(“小説を読みましょう。”);
}
@Override
public void show_info() {
System.out.println(“これは小説です。”);
}
}
|
3:どちらを使うべき?
mainメソッドはそのままで同じように動作します。このことからも抽象クラスとインターフェイスがとても似ていることがわかるでしょう。
では抽象クラスとインターフェイス、どちらを使用した方がよいのでしょうか。答えは、インターフェイスです。抽象クラスは1つしか親に持てませんが、インターフェイスはいくつでも実装できるという点が大きいですね。
Java8以前のインターフェイスはdefaultが無かったので、抽象クラスは普通の処理も記述できるというメリットがあったのですが、defaultが導入されたのでその差もなくなりました。
システム
エンジニア抽象クラスとインターフェイスの違いや置き換え方などよくわかりました。
プロジェクト
マネージャーJavaのスキルを高めるためにも抽象クラスの考え方を理解することはとても重要です。
抽象クラスの概念を知ってJavaのスキルを高めよう
Javaのabstructによる抽象クラスの使い方を解説しましたが、ご理解できましたでしょうか。
抽象クラスよりインターフェイスを使う方が望ましいのですが、抽象クラスの考え方を理解するためにも抽象クラスを是非使ってみましょう。使用することでオブジェクト指向プログラミングのスキルが高まるのは間違いないでしょう。
FEnet.NETナビ・.NETコラムは株式会社オープンアップシステムが運営しています。
株式会社オープンアップシステムはこんな会社です
秋葉原オフィスには株式会社オープンアップシステムをはじめグループのIT企業が集結!
数多くのエンジニアが集まります。

-
スマホアプリから業務系システムまで
スマホアプリから業務系システムまで開発案件多数。システムエンジニア・プログラマーとしての多彩なキャリアパスがあります。
-
充実した研修制度
毎年、IT技術のトレンドや社員の要望に合わせて、カリキュラムを刷新し展開しています。社内講師の丁寧なサポートを受けながら、自分のペースで学ぶことができます。
-
資格取得を応援
スキルアップしたい社員を応援するために資格取得一時金制度を設けています。受験料(実費)と合わせて資格レベルに合わせた最大10万円の一時金も支給しています。
-
東証プライム上場企業グループ
オープンアップシステムは東証プライム上場「株式会社オープンアップグループ」のグループ企業です。
安定した経営基盤とグループ間のスムーズな連携でコロナ禍でも安定した雇用を実現させています。
株式会社オープンアップシステムに興味を持った方へ
株式会社オープンアップシステムでは、開発系エンジニア・プログラマを募集しています。
年収をアップしたい!スキルアップしたい!大手の上流案件にチャレンジしたい!
まずは話だけでも聞いてみたい場合もOK。お気軽にご登録ください。


新着案件New Job
-
開発エンジニア/東京都品川区/【WEB面談可】/在宅ワーク
月給29万~30万円
東京都品川区(大崎駅)
-
遠隔テストサービス機能改修/JavaScript/東京都港区/【WEB面談可】/テレワーク
月給45万~60万円
東京都港区(六本木駅)
-
病院内システムの不具合対応、保守/東京都豊島区/【WEB面談可】/テレワーク
月給30万~30万円
東京都豊島区(池袋駅)
-
開発/JavaScript/東京都豊島区/【WEB面談可】/テレワーク
月給50万~50万円
東京都豊島区(大塚駅)
-
債権債務システム追加開発/東京都文京区/【WEB面談可】/在宅勤務
月給62万~67万円
東京都文京区(後楽園駅)
-
PMO/東京都豊島区/【WEB面談可】/在宅勤務
月給55万~55万円
東京都豊島区(池袋駅)