##概要
抽象化とインターフェースの復習として投稿させて頂きます。
##抽象化
上位モジュールにおいて、下位モジュールに共通実装するメソッドや変数を宣言し、実装は下位モジュールに任せる。
また、抽象化したクラスはインスタンス生成を行えない。
・抽象化を行うことのメリット
- オーバーライドのし忘れ防止
- 何もしない処理との区別をつける
- 意図しないインスタンス生成の防止
Human.java
public abstract class Human{
private String name;
public Human(String name){
this.name = name;
}
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
//共通したメソッドを宣言し実装は下位モジュールに任せる
public abstract void talk();
//何もしないメソッド
public void tmp(){}
}
Japanese.java
public class Japanese extends Human{
public Japanese(String name){
super(name);
}
@Override
public void talk(){
System.out.println("こんにちは");
}
}
American.java
public class American extends Human{
public American(String name){
super(name);
}
@Override
public void talk(){
System.out.println("Hello");
}
}
Main.java
public class Main{
public static void main(String[] args){
//Human human = new Human("山田太郎");
//インスタンス生成出来ない為、コンパイルエラー
Japanese jp = new Japanese("山田太郎");
jp.talk(); //こんにちは
American en = new American("TaroYamada");
en.talk(); //Hello
}
}
##インターフェース
インターフェースでは、抽象化と同様共通実装するメソッドを宣言し、インターフェースを継承したクラスに実装を任せることが出来る。しかし、フィールドに関しては抽象クラスと扱いが異なる。
インターフェースの特徴
- 基本的にフィールドは一つも持たない
- 全てのメソッドは抽象メソッドとなる。
インターフェースにおいて基本的にフィールドを実装することは許されていないが、public static finalがついたフィールドだけは宣言することが出来、インターフェースに型名から変数宣言を始めると自動的に付加される。再代入不可のfinal修飾子が付いているため、変数宣言と同時に初期化を行う必要がある。
また、メソッドに関して、インターフェースに宣言できるメソッドはpublicかつabstractなものに限定され、戻り値の型から宣言した場合は自動的に付加される。
Creature.java
public interface Creature{
//public static final double PI = 3.14;
double PI = 3.14; // 自動的にpublic static finalな変数となる。
//public abstract void breath();
void breath(); //自動的にpublic abstractなメソッドとなる。
}
##まとめ
未だ、継承を用いた開発経験が少ないため、メリットの恩恵を受けづらいというのが正直な感想。