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 についてでした。