Java abstract について

Java の abstract についてご紹介します。Java の interface と比較されがちな2つです。interface の詳細は次の記事にあります。

Java interface について
Java の interface についてご紹介します。interface は継承関係のないクラスに、機能を提供する仕組みです。 in...

サンプルとなるコードを見ながらだと理解が早いと思いますので、サンプルとなるコードと合わせて説明していきます。

abstract(抽象)

アブストラクト(抽象)の説明です。こちらも3つのサンプルとなるファイルを使用して説明していきます。

AbstractTest.java
abstract class AbstractTest{

  // 定義のみ
  abstract void test();

  // 定義のみの場合は、abstract修飾子が無いとエラーになる
  // void test2();

  // 実装も記述出来る
  void test3(){
    System.out.println("test3");
  };
}

これがアブストラクト(抽象)です。abstract修飾子を使用したクラスを抽象クラス、abstract修飾子を使用したメソッドを抽象メソッドと言います。

アブストラクトは定義と実装を記述することが出来ます。定義を記述する際は abstract修飾子 と記述しないとエラーになります。

また、抽象メソッドを含むクラスに abstract修飾子 を記述しないとエラーになります。

AbstractTestExtends.java
class AbstractTestExtends extends AbstractTest {

  // 必ず実装が必要
  public void test(){
    System.out.println("test");
  };

  // 継承クラス独自の実装も出来る
  public void test2(){
    System.out.println("test2");
  };
  // 実装済メソッドはオーバーライドしなくてもしてもいい 
  //@override
  //public void test3(){
  //  System.out.println("test3");
  //};
}

extends を継承と言います。上記のクラスは、抽象クラスの継承クラスです。抽象メソッドは継承クラスで必ず実装しなくてはなりません。実装しないとエラーになります。

抽象クラスで定義されていないメソッドも、継承クラスでは実装することが出来ます。

抽象クラスで実装されているメソッドは、継承クラスでオーバーライドしなくてもエラーにはなりません。

Main.java
import java.util.*;

public class Main {
  public static void main(String[] args) throws Exception {

    // 抽象クラスをextendsしたクラスをインスタンス化
    AbstractTestExtends abstractTestExtends = new AbstractTestExtends();

    // 抽象クラスで実装したメソッド、抽象クラスをextendsしたクラスで実装したメソッドを呼び出せる 
    abstractTestExtends.test();
    abstractTestExtends.test2();
    abstractTestExtends.test3();
  }
}

継承クラスをインスタンス化して使用します。抽象クラス自体はインスタンス化することは出来ません。

継承クラスをインスタンス化すると、抽象クラスで実装したメソッドも使用することが出来ます。

以上、Java abstract についてでした。