インターフェースと抽象クラス
1. インターフェース
実装のないメソッドを定義することができる。
インターフェースを実装したクラスにメソッドの実装を強制することができる。
⇒インターフェースをきちんと作れば実装漏れがなくなる。
宣言
public interface Sample { }
メンバ変数・メソッド
メンバ変数
インターフェースではメンバ変数として宣言できるのは定数のみ。
public interface Sample { String phoneNumber; // このように宣言しても、自動的に「public static final」が付加される }
メソッド
インターフェースでは抽象メソッド・デフォルトメソッド・staticメソッド・privateメソッドが宣言可能。
このうち抽象メソッド以外は実装を持つメソッドである。
// インターフェースの定義 public interface Sample { // defaultメソッド(publicが自動で付与される) default void defaultMethod(int x, int y) { print(apply(x, y)); } // staticメソッド static void staticMethod() { System.out.println("static method"); } // privateメソッド private void print(int z){ System.out.println("result : " + z); } // 抽象メソッド(public abstractが自動的に付与される) int apply(int x, int y); } // インターフェースの実装 public class Multiplication implements Sample { // 抽象メソッドは実装クラスで実装する @Override public int apply(int x, int y) { return x * y; } } public class Main { public static void main(String[] args) { Multiplication multipl = new Multiplication(); multipl.defaultMethod(2, 3); // result:6 // staticメソッドはインターフェース名.メソッド名で呼ぶ // 実装クラスからは呼べない Sample.staticMethod(); } }
メソッドの種類 | 説明 |
---|---|
抽象メソッド | 実装クラスに処理を必ず書いてもらいたいときに使う |
デフォルトメソッド | インターフェースで共通な処理を書く。他のクラスに依存しないような処理をするに留める。 |
staticメソッド | staticに呼んでほしい時に書く。他のクラスに依存しないような処理をするに留める。 |
privateメソッド | 同一インターフェース内のstaticメソッドやデフォルトメソッドから使う |
2. 抽象クラス
1つ以上の抽象メソッドを持つクラスのこと。
宣言
public abstract class AbstractSample { }
メンバ変数・メソッド
メンバ変数
抽象クラスではメンバ変数は他のクラスと同じように使用できる
public abstract class AbstractSample { // 他のクラスと同様にメンバ変数として使用可能 protected String name; }
メソッド
抽象クラスでは、抽象メソッド以外の実装メソッドも自由に実装することができる
public abstract class AbstractSample { // 抽象メソッド public abstract String doSomething(String firstName, String lastName); // 実装メソッド protected void print(){ System.out.println(name); } } public class Sample extends AbstractSample { // 抽象メソッドは実装クラスで実装する @Override public int doSomething(String firstName, String lastName) { return firstName + lastName; } }
3. 抽象クラスとインターフェイスの差異
項目 | 抽象クラス | インターフェイス |
---|---|---|
アクセス修飾子 | public, protected | public |
メンバ変数 | クラスのメンバ変数と同じ | 定数のみ(自動でpublic static finalが付加される) |
抽象メソッド | 1つは定義する | public abstractが自動的に付与される |
実装を持つメソッド | 実装可能 | defaultメソッドとstaticメソッド, privateメソッドが実装可能 |
継承 | 多重継承不可 | 多重継承可 |
使い分け | 共通処理をまとめて処理の骨組みを作る | クラスの型を定義する |