【納得Java】抽象クラス(abstract)を使うメリット

こんにちは!侍エンジニア インストラクターの本多です。

みなさんは、abstractクラス(抽象クラス)というものをご存知でしょうか?

ルールがいくつかあって使いにくいところもありますが、大規模開発では欠かせないものです。この記事では、Javaabstractクラスについて

  • abstractクラスとは何か
  • abstractクラスの使い方

という基本的な内容から、

  • abstractクラスの注意点
  • interfaceとの違い

といった応用的な内容に関しても解説していきます。今回はabstractクラスについて、わかりやすく解説していきます!

abstractクラスの利点とは

abstractクラスとは、抽象メソッドを1つ以上持つクラスです。まず抽象メソッドは何か?というところから解説します。

抽象メソッドとは実装を持たない、シグネチャ(メソッド名、引数の型、引数の数)と戻り値の型のみを定義するメソッドです。

具体的には、以下の通りです。先頭にabstractとついているところ、引数のカッコのあとに{ } がないところに注目してください。

次に、抽象クラスです。抽象クラスとは、抽象メソッドを1つ以上持つクラスです。

抽象クラスは下記のように記述します。

抽象クラスで抽象メソッドを持つ利点とは、開発者側にメソッドのオーバーライドを強制するということができることです。

抽象クラスを継承したサブクラスごとに抽象メソッドをオーバーライドして処理内容を記述する必要があります。

しかし、サブクラスごとに処理内容は別々にできます。サブクラスごとに処理内容はまちまちになる、でも必ず処理内容を記述しなければならない、という場合は抽象クラスで抽象メソッドを持つ利点を利用することになります。

抽象メソッドの使い方

抽象メソッドを使うには、抽象クラスを「extends」句で継承する必要があります。

下記のように記述します。

では、実際に抽象メソッドの使い方を見てみましょう。

実行結果:

AbstractClassを継承したMainクラスに実装を記述しています。

抽象クラスの注意点

抽象クラスを使う上で、いくつかルールがあります。

  • 直接インスタンス化できない。
  • 抽象メソッドは全てオーバーライドしなくてはならない。
  • サブクラスでコンストラクタを記述する必要がある

順に見ていきましょう。

直接インスタンス化できない

抽象クラスは、そのままでは使えません(つまり、インスタンス化できません)。

試しに、上記のAbstractClassをインスタンス化してみましょう。

実行結果:

このサンプルコードでは、エラーメッセージが表示されます。

AbstractClassは抽象クラスなのでインスタンス化できません。

抽象メソッドのオーバーライド

抽象クラスの抽象メソッドは、必ず全てオーバーライドする必要があります。

先の例のメソッド名を変えて、抽象メソッドをオーバーライドしないように変更します。

実行結果:

abstractMethodをオーバーライドしていません、とエラーになりました。これが一体何の役に立つのでしょうか?

メリットは、開発者側にメソッドのオーバーライドを強制するということができます。クラスによってロジックはまちまちになる、でも必ず書かなくてはいけない、という場合はこの特性を利用できます。

コンストラクタを使う方法

abstractクラスのコンストラクタを使う方法について説明します。先ほどご説明したとおりabstractクラスは直接インスタンス化できません。

また、サブクラスではスーパークラスのコンストラクタを「super」句を使って継承する必要があります。

サブクラスはインスタンス化できるので、サブクラスをインスタンス化してスーパークラスから継承したコンストラクタを使用します。サンプルコードで確認しましょう。

実行結果:

このサンプルコードでは、SubClassクラスは抽象クラスAbstractClassを継承しています。SubClassクラス内で抽象クラスAbstractClassのコンストラクタを「super」句を使って継承しています。

Mainクラス内ではSubClassクラスをインスタンス化して抽象クラスAbstractClassのコンストラクタを使用しています。

なお、継承したクラスのコンストラクタについては、以下の記事にまとめていますので、ぜひ参考にしてくださいね!

【Java入門】継承とコンストラクタの呼び出し(super/this)
更新日 : 2018年11月20日

インターフェースとの違い

抽象クラスインターフェースとの違い、使い分けを表一覧にしてみました。

 抽象クラスインターフェース
抽象メソッドサブクラスで必ず実装抽象メソッドのみ記述
(自動でpublic abstract)
実装を持つメソッド実装可能実装不可(抽象メソッドのみ)
(Java8以降、defaultを使って実装可)
メンバ変数クラスのメンバ変数と同じ必ず定数(自動でpublic static final)
多重継承不可(単一継承のみ)可能

Java7以前は「インターフェースは直接インスタンス化できない」という違いがあったのですが、Java8以降はインターフェースも直接インスタンス化できてしまいます。

サンプルコードで確認しましょう

実行結果:

では、抽象メソッドとインターフェースの違いは何かというと、多重継承ができるかどうかです。

インターフェースは下記のように複数のインターフェースを実装することができます。

よってインターフェースは、より柔軟な実装ができます。

ただし、多重継承を使いすぎると複雑になりすぎるというデメリットがあるので、十分注意する必要があります。

クラスについてもっと詳しく知りたい方へ

クラスのさまざまな使い方については、以下の記事にまとめていますので、ぜひ参考にしてくださいね!

【Java入門】クラスの使い方総まとめ
更新日 : 2019年7月24日

interface(インターフェース)の使い方総まとめ

interface(インタフェース)のいろいろな使い方を次の記事にまとめているので、ぜひ確認してください!

【Java入門】interface(インタフェース)の使い方総まとめ
更新日 : 2019年4月26日

まとめ

この記事では、abstractクラスを説明しました

取り扱いのルールが難しいabstractですが、注意しながら使えば問題ありません。

使い方を忘れた場合、本記事を参考にしてくださいね!

LINEで送る
Pocket

最短でエンジニアを目指すなら侍エンジニア塾

cta_under_bnr

侍エンジニア塾は業界で初めてマンツーマンレッスンを始めたプログラミングスクールです。これまでの指導実績は16,000名を超え、未経験から数多くのエンジニアを輩出しています。

あなたの目的に合わせてカリキュラムを作成し、現役エンジニア講師が専属であなたの学習をサポートするため効率よく学習を進めることができますよ。

無理な勧誘などは一切ありません。まずは無料体験レッスンを受講ください。

無料体験レッスンの詳細はこちら

書いた人

本多 農

本多 農

関西在住のITエンジニアです。普通の会社に勤務しながら、侍エンジニアのインストラクター、ライターとして活動しています。

おすすめコンテンツ

あなたにぴったりなプログラミング学習プランを無料で診断!

プログラミング学習の効率を劇的に上げる学習メソッドを解説