🎯
【Java】クラス解説36・インターフェイス
インターフェイス
インターフェイスとは、下記の特徴があります。
- 直接的にインスタンス化できない。
- フィールドは定数のみです。暗黙的に
public static final
になり、初期化子が必要になります。 - メソッドは原則論的には
public
な抽象メソッド(=処理内容を実装しない)ですが、static
、default
及びprivate
を用いることにより、処理内容を実装できるようになりました。 - インターフェイスの特性を引き継いだクラスを定義する時は、
implements
を使用する。implements
によりポリモーフィズムを活用することができます。
インスタンス化できないコード例
import java.util.*;
public class Main {
public static void main(String[] args) {
Fuzi fz = new Fuzi();
}
}
interface Fuzi {
}
下記のエラーメッセージが出てくるので、interface
がインスタンス化できないことが分かります。
Main.java:5: error: Fuzi is abstract; cannot be instantiated
Fuzi fz = new Fuzi();
^
1 error
フィールドが定数のみであるコード例
import java.util.*;
public class Main {
public static void main(String[] args) {
Fuzi.fuzi = 2323;
}
}
interface Fuzi {
int fuzi = 23;
}
下記のエラーメッセージが出てくるので、変数fuzi
が定数であるため、値の再代入ができないことが分かります。
Main.java:5: error: cannot assign a value to final variable fuzi
Fuzi.fuzi = 2323;
^
1 error
フィールドに初期化子が必要であるコード例
import java.util.*;
public class Main {
public static void main(String[] args) {
}
}
interface Fuzi {
int fuzi;
}
下記のエラーメッセージが出てくるので、=
を使って変数fuzi
に初期値を代入する必要があります。
Main.java:10: error: = expected
int fuzi;
^
1 error
staticを用いた処理内容の実装
import java.util.*;
public class Main {
public static void main(String[] args) {
Fuzi.print();
}
}
// インターフェイスを定義
interface Fuzi {
// staticなメソッドを定義
static void print() {
// 処理内容を実装
System.out.println("23");
}
}
出力結果
23
インターフェイスのメソッドは、本来、抽象メソッドであり処理内容を実装できません。
しかし、static
を用いることにより、処理内容を実装できました。
implementsとポリモーフィズムを用いたコード例
import java.util.*;
public class Main {
public static void main(String[] args) {
// アップキャスト
Blooming o1 = new Fuzi();
// ポリモーフィズム
o1.bloom();
// アップキャスト
Growing o2 = new Fuzi();
// ポリモーフィズム
o2.grow();
}
}
interface Blooming {
void bloom();
}
interface Growing {
void grow();
}
class Plant {
}
// インターフェイスを実装したサブクラスを定義
class Fuzi extends Plant implements Blooming, Growing {
// オーバーライド
public void bloom() {
System.out.println("咲く");
}
// オーバーライド
public void grow() {
System.out.println("育つ");
}
}
出力結果
咲く
育つ
インターフェイスの直接的なインスタンス化はできませんが、implements
によりポリモーフィズムを活用できるため、オーバーライドしたメソッドを実行することができます。
default、private及びimplementsを用いたコード例
import java.util.*;
public class Main {
public static void main(String[] args) {
Fuzi o = new Sakura();
o.print();
}
}
// インターフェイスを定義
interface Fuzi {
// defaultなメソッドを定義
default void print() {
// 処理内容を実装
System.out.println(getString());
}
// privateなメソッドを定義
private String getString() {
return "23";
}
}
class Sakura implements Fuzi {
}
出力結果
23
ポリモーフィズムにより、処理内容を実装したdefault
なメソッドにオーバーライドすることなくアクセスできました。
また、インターフェイス内のprivate
なメソッドにアクセスすることができました。
Discussion