Java の abstract についてご紹介します。Java の interface と比較されがちな2つです。interface の詳細は次の記事にあります。
サンプルとなるコードを見ながらだと理解が早いと思いますので、サンプルとなるコードと合わせて説明していきます。
abstract(抽象)
アブストラクト(抽象)の説明です。こちらも3つのサンプルとなるファイルを使用して説明していきます。
abstract class AbstractTest{
// 定義のみ
abstract void test();
// 定義のみの場合は、abstract修飾子が無いとエラーになる
// void test2();
// 実装も記述出来る
void test3(){
System.out.println("test3");
};
}
これがアブストラクト(抽象)です。abstract修飾子を使用したクラスを抽象クラス、abstract修飾子を使用したメソッドを抽象メソッドと言います。
アブストラクトは定義と実装を記述することが出来ます。定義を記述する際は abstract修飾子 と記述しないとエラーになります。
また、抽象メソッドを含むクラスに abstract修飾子 を記述しないとエラーになります。
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 を継承と言います。上記のクラスは、抽象クラスの継承クラスです。抽象メソッドは継承クラスで必ず実装しなくてはなりません。実装しないとエラーになります。
抽象クラスで定義されていないメソッドも、継承クラスでは実装することが出来ます。
抽象クラスで実装されているメソッドは、継承クラスでオーバーライドしなくてもエラーにはなりません。
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 についてでした。