支援対象地域:札幌、仙台、関東、愛知、関西、広島、福岡

  • TOP
  •   
  • コラム
  •   
  • 「Java」抽象クラスについて。ab

Javaを学習中の方のために、当記事では「abstract」、「抽象クラス」「抽象メソッド」の意味や使い方についてご紹介します。

abstractとは?

Javaでいうabstractとは「抽象クラス」を表す修飾子です。修飾子とはfinalやpublic、privateなどのことを指します。
そして「abstract」とは、「抽象的な、あいまいな」という意味を持っています。
Javaでは、「abstract」修飾子のついたクラスやメソッドを、「抽象クラス」、「抽象メソッド」と呼びます。

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

まず、抽象メソッドとは、「処理内容が確定していないメソッド」のことを指します。
通常、メソッドは

public void method(){
    System.out.println("hogehoge");
} 

このように記述するのが普通ですが、抽象メソッドでは

abstract void method();

このように記述します。
注目すべきは、通常のメソッドでは処理を書くための「{}(波かっこ)」を書かず、記述を終了している点です。
抽象メソッドは、具体的な処理内容を持たないメソッドなので、「{}」を書く必要がないので、このような記述の仕方となっています。
そして、「抽象クラス」とは、「抽象メソッドを内包するクラス」のことを指します。
1つでもabstractのついたメソッドがあると、クラス名のほうにもabstrac修飾子を付けなければいけません。

抽象クラス/抽象メソッドについてより詳しく

抽象クラスは継承されることが前提のクラス、抽象メソッドはオーバーライドされることが前提のメソッドです。「オーバーライド」とはメソッドなどを再定義することを指します。
継承先でオーバーライドされていないとエラーとなってしまいますので、オーバーライドを強制することができます。
また、抽象クラスはインスタンス化することができません。
処理内容が未確定なクラスをインスタンス化できてしまうと、不具合を含んだプログラムができてしまう恐れがあるからです。

また、インスタンス化できないということは、コンストラクタも定義することはできません。
コンストラクタを使用する際は、継承先で定義するようにしましょう。

実際の記述

抽象クラスを定義し、継承する際のコードを見てみましょう。

abstract class TestA{
    abstract void sample();
}

抽象クラスができました。これを継承します。

public class TestB extends TestA{
    void sample(){
    System.out.println("オーバーライドしました");
    }
}

継承先で、sampleメソッドをオーバーライドしました。
ここでオーバーライドしていないとエラーとなってしまいますので注意しましょう。

抽象クラスを使うメリット

なんのためにわざわざabstractをつけて処理内容を記述していないメソッドを用意し、それを継承するのか、という疑問は当然かと思います。
実際に抽象クラスを使う利点は、個人でのプログラム開発ではあまり実感できません。
抽象クラスはチームでプログラムを開発する時に必要な知識です。

例えば、開発時、とあるクラスに最低限つけてほしい機能があったとします。
その最低限つけてほしいクラスが本当にすべて実装されているかどうか、といった確認はどのように行うでしょうか?
目視で確認していってもかまいませんが、人のやることですので必ず見落としがありますし、効率も非常に悪いです。
先ほど、「抽象メソッドは継承先でオーバーライドされていないとエラーとなる」と書きましたが、これはつまり「最低限つけてほしい機能を実装していないとエラーになる」と置き換えることができます。
abstractで「最低限つけてほしい機能」を親クラスに定義しておき、それらを継承させることで、継承先にはすべて最低限つけてほしい機能が実装されます。
これがabstractで抽象クラスを定義するメリットです。
抽象クラスを利用することで、開発に一定のルールを設定できるようになることが最大のメリットと言えるでしょう。

Java初心者の方には抽象クラスを使うメリットが少し理解しづらいかもしれませんが、abstractを記述する際のルールは覚えておきましょう。
以下に再度ポイントをまとめておきます。

  • 抽象クラスをインスタンス化することはできない
  • 抽象クラスは継承して使用する
  • 抽象メソッドは継承先で必ずオーバーライドする
  • コンストラクタは子クラスで定義する

最後に

以上が、Javaにおける「abstract」、「抽象クラス」「抽象メソッド」などについての解説となります。
抽象クラスなどについては、Java初心者の方には少しイメージしづらく難解なポイントだとは思いますが、オブジェクト指向を理解するうえでは避けては通れない部分ですので、しっかりと学習していきましょう。