抽象クラスはabstract宣言されたクラスであり、抽象メソッドを含んでも含まなくてもよいです。
抽象クラスはインスタンス化することはできませんが、サブクラス化することはできます。
抽象メソッドは、実装なしで宣言されたメソッドです
抽象クラスの概念としては、インターフェイスと実体クラスの間の位置づけのクラスとして理解しておけば良いでしょう。
抽象クラスの特徴は以下になります。
抽象クラスは、Javaの慣習で接頭語に「Abstract」を付与します。
abstract
class AbstractHoge {}
上記UMLのように、AbstractSampleクラスのexecAllSamples()メソッドが抽象メソッドになっています。
AbstractSampleクラスは継承した子クラスがexecAllSamples()メソッドを実装しています。
AbstractSamples.java
//ライセンスコメント割愛
//package宣言部
package jp.co.yourcompany.education.samples;
/**
* 抽象クラスサンプル
* @author Raita.Kuwabara
*/
public abstract class AbstractSamples {
/**
* 継承した子クラスのサンプルを全て実行する
*/
protected abstract void execAllSamples();
/**
* メソッド共通の開始文の定型出力
* @param methodName 出力するメソッド名
*/
protected void outputStartMethod( String methodName ) {
System.out.println("----- " + methodName + " START -----");
}
/**
* メソッド共通の開始文の定型出力
* @param methodName 出力するメソッド名
*/
protected void outputEndMethod( String methodName ) {
System.out.println("----- " + methodName + " END -----");
}
}
SimpleSample.java
//ライセンスコメント割愛
package jp.co.yourcompany.education.samples;
/**
* 抽象クラスを継承した子クラスのサンプル
* @author Raita.Kuwabara
*/
public class SimpleSample extends AbstractSamples {
/**
* サンプルを全て実行する。
*/
@Override
public final void execAllSamples() {
outputStartMethod( "execAllSamples" );
outputMessage();
outputStartMethod( "execAllSamples" );
}
/**
* メッセージを標準出力に出力する。
*/
private void outputMessage(){
System.out.println("SimpleSample.execAllSamples ");
}
public static void main(String[] args){
SimpleSample samples = new SimpleSample();
samples.execAllSamples();
//抽象クラスなのでインタタンスは生成できません。
//以下のコードはNG
//AbstractSamples abstractSamples = new AbstractSamples();
//abstractSamples.execAllSamples();
}
}
インターフェイスや抽象クラスをクラス設計から起こし、実装で利用できるには最低3年以上かかります。
このようなケースは一流のソースを見て感じた方が理解が早いです。
一番上位に位置づけられているのがErorrsインターフェイスです。
3つの実態クラス(MapBindingResult,BeanPropertyBindingResult,DirectFieldBindingResult)があります。
インターフェイスで必ず実装しなくてはならないメソッドを明示したうえで、各オブジェクトで実態化されていきます。
インターフェイスの全てのメソッドを実装していないので、abstractクラスとして定義されます。
ソースファイルの見方は、詳細を捉える必要はありません。
メソッド名の完全一致(戻り値、メソッド名、引数)したメソッドを親と子クラスで見比べていきます。
一流のスタンスを学ぶために用意したので、今は分からなくても凡その
インターフェイス、抽象クラス、クラスの繋がりが感じられれば幸いです。
以下にSpringFrameworkのspring-contextパッケージ内のvalidationを抜粋したzip(15Kb程度)をダウンロードできるようにしています。
©Pivotal Software本頁のサンプル及び一流のソースコードにfinal
修飾子が幾つか見受けられました。
final修飾子は親クラス、インターフェイスで定義した抽象メソッドやprotectedメソッドのオーバライド(実装)が 子クラス内で最後であることを意味します。
final修飾子が付与されたメソッドは、子クラスでオーバライドができません。
final
class HogeClass exetends 親クラス {}
@Override
final
戻り値 メソッド名( 引数 ) {}