インターフェースの概要:
インターフェイスは、Java言語の参照型であり、"コレクション "のメソッドであるため、インターフェイスは主に定数、抽象メソッド、追加のデフォルトメソッドと静的メソッド、追加のプライベートメソッドを含むメソッドの内部に定義されています。
インターフェイスは、クラスの定義と同じような方法で定義されますが、インターフェイス・キーワードを使用します。また、.classファイルにコンパイルされますが、それがクラスではなく、別の参照データ型であることを明確にしなければなりません。
パブリッククラス name.java->.class
public interface interface name.java->.class
インターフェースは、オブジェクトを生成することはできませんが、実装することはできます。インターフェイスを実装するクラスは、インターフェイスの抽象メソッドをすべて実装し、そのクラスのオブジェクトを作成すれば、メソッドを呼び出すことができます。
フォーマットの定義
public interface インターフェース名 {
//
// 抽象メソッド
// デフォルト・メソッド
// 静的メソッド
// プライベート・メソッド
}
ケース
public interface IA {
// 定数 デフォルト修飾子 public static final これら3つの修飾子は省略可能である。
public static final int NUM1 = 10;
int NUM2 = 20;
// 抽象メソッド デフォルト修飾子 public abstract これら2つの修飾子は省略可能である。
public abstract void method1();
void method2();
// デフォルト・メソッド デフォルト修飾子 public デフォルト修飾子は省略可能、デフォルトは省略できない
public default void method3(){
System.out.println("デフォルト・メソッド method3");
}
default void method4(){
System.out.println("デフォルト・メソッド method4");
}
// 静的メソッド: public static修正 static 修飾子は省略できない public は省略できる
public static void method5(){
System.out.println("静的メソッド method5");
}
// private static メソッド private static 修飾子を使用する 省略不可
private static void method6(){
System.out.println("プライベート静的メソッド method6");
}
// 静的でないプライベート・メソッド private修飾子を使う
private void method7(){
System.out.println("プライベート静的メソッド method7");
}
}
public class Test {
public static void main(String[] args) {
System.out.println(IA.NUM1);// 10
}
// デフォルト許可修飾子を使ったクラス内のデフォルト・メソッド
void method(){
}
}
インターフェイス内のメンバーのアクセス特性
インターフェースにおける会員アクセス機能の概要
インターフェイス内のメンバのアクセス特性:
インターフェイス内の定数: 主にインターフェイスが直接使用する
インターフェイスの抽象メソッド: 実装クラスがオーバーライドする
インターフェースのデフォルト・メソッド: クラス継承の実装
インターフェースの静的メソッド: インターフェイスが直接呼び出す場合のみで、実装では呼び出さない。
インターフェースのプライベート・メソッド: インターフェイスから直接呼び出せるだけで、実装からは呼び出せない。
ケース・デモンストレーション
public interface IA {
// インターフェイス内の定数: 主にインターフェイスが直接使用する
public static final int NUM = 10;
// インターフェイスの抽象メソッド: 実装クラスがオーバーライドする
public abstract void method1();
// インターフェースのデフォルト・メソッド: クラス継承の実装
public default void method2(){
System.out.println("デフォルト・メソッド method2");
method4();
method5();
}
// インターフェースの静的メソッド: インターフェイスが直接呼び出す場合のみで、実装では呼び出さない。
public static void method3(){
System.out.println("静的メソッド method3");
method5();
}
// インターフェースのプライベート・メソッド: インターフェイスから直接呼び出せるだけで、実装からは呼び出せない。
private void method4(){// インターフェースのデフォルト・メソッドからのみ呼び出せる
//
method5();
}
private static void method5(){//
//
}
}
:
public class ImpA implements IA{
/* @Override
public void method2() {
}*/
@Override
public void method1() {
System.out.println("インターフェイスのmethod1抽象メソッドを書き換える");
}
}
:
public class Test {
public static void main(String[] args) {
System.out.println(IA.NUM);// 10
// 実装クラスオブジェクトの作成、NUM定数へのアクセス
ImpA ia = new ImpA();
System.out.println(ia.NUM);// 10
// メソッド2を呼び出す
ia.method2();
// インターフェイス内のスタティック・メソッドをその名前で呼び出す
IA.method3();
//ia.method3();// コンパイル・エラー,
}
}
複数のインプリメンテーションのためのいくつかの衝突シナリオ
パブリックな静的定数に関するコンフリクト: 同じ定数を複数の親インターフェースから継承することはできません - パブリックな抽象メソッドに関するコンフリクト: 実装クラスが一度書き換える必要があります - パブリックなデフォルトメソッドに関するコンフリクト: 実装クラスが書き換える必要があります - パブリックな静的メソッドに関するコンフリクト: 静的メソッドは実装クラスに継承されないため、影響はありません - プライベートメソッドに関するコンフリクト: プライベートメソッドはこのインターフェースから直接アクセスすることしかできず、 実装クラスには継承されないため、影響はありません - 実装クラスはデフォルトメソッドを追加することなく、デフォルトメソッドをオーバーライドします - 実装クラスはデフォルトメソッドを追加することなく、デフォルトメソッドをオーバーライドします - 実装クラスはデフォルトメソッドを追加することなく、デフォルトメソッドをオーバーライドします。このクラスは、インターフェースのデフォルト・メソッドをオーバーライドします。
パブリック静的定数の競合
実装クラスは競合する変数を継承しません。
interface IA{
public static final int a = 10;
public static final int b= 20;
}
interface IB{
public static final int a = 30;
}
class Zi implements IA,IB{
//bのみを継承し、aは継承しない。
}
public class Demo {
public static void main(String[] args) {
Zi z = new Zi();
// System.out.println(z.a);//コンパイル・エラー
System.out.println(z.b);
}
}
パブリック抽象メソッドにおける競合
実装クラスは
interface IA{
public void show();
}
interface IB{
public void show();
}
class Zi implements IA,IB{
@Override
public void show() {//サブクラスはshow()をオーバーライドするだけでよい。
System.out.println("サブクラスのshow()...");
}
}
public class Demo {
public static void main(String[] args) {
Zi z = new Zi();
z.show();
}
}
パブリック・デフォルト・メソッドの競合
実装クラスは最終版を一度書き直さなければなりません。
interface IA{
public default void show(){
System.out.println("IA");
}
}
interface IB{
public default void show(){
System.out.println("IB");
}
}
class Zi implements IA,IB{
@Override
public void show() {//show()を一度書き直さなければならない
System.out.println("Zishow()....");
}
}
public class Demo {
public static void main(String[] args) {
Zi z = new Zi();
z.show();
}
}
パブリック静的メソッドの競合
静的メソッドは直接インターフェースの一部であり、継承することはできません。
interface IA{
public static void show(){
System.out.println("IA");
}
}
interface IB{
public static void show(){
System.out.println("IB");
}
}
class Zi implements IA,IB{
}
public class Demo {
public static void main(String[] args) {
Zi z = new Zi();
z.show();//show()は継承できない。
}
}
プライベート・メソッドの競合
プライベート・メソッドはこのインターフェイスの中でしか直接使えません。
インタフェースとインタフェースの関係
インターフェイスは他のインターフェイスを「継承」することができ、また「多くのインターフェイスを継承」することができます。
interface IA{}
interface IB{}
interface IC extends IA,IB{//は「継承」である。”,そして、「多重継承」は可能だ。”
}
インターフェイスがインターフェイスを継承する場合のコンフリクト
パブリック静的定数とのコンフリクト:継承できず、使えない パブリック抽象メソッドとのコンフリクト:継承されるのは1つだけ パブリックデフォルトメソッドとのコンフリクト:一度書き直す必要がある パブリック静的メソッドとプライベートメソッドとのコンフリクト:サブインター フェースで継承できないため、影響なし
パブリック静的定数の競合
interface IA{
public static final int a = 10;
public static final int b = 30;
}
interface IB{
public static final int a = 20;
}
interface IC extends IA,IB{//継承なし
}
//
main(){
System.out.println(IC.a);//
}
パブリック抽象メソッドの競合
interface IA{
public void show();
}
interface IB{
public void show();
}
interface IC extends IA,IB{//IC1つのshow()のみを継承する
}
class Zi implements IC{
//show()を一度書き直す。
public void show(){
}
}
パブリック・デフォルト・メソッドの競合
interface IA{
public default void d1(){
}
}
interface IB{
public default void d1(){
}
}
interface IC extends IA,IB{//d1()を一度書き直さなければならない
public default void d1(){
}
}
パブリック静的メソッドとプライベートメソッド
ない競合は、静的メソッドが直接インターフェイスに属しているため、唯一のプライベートメソッドは、インターフェイスにのみアクセスすることができますが、直接アクセスするには、インターフェイスを使用することができます親クラスのクラス継承の実装とインターフェイスの実装の競合はありません。
フォーマットの定義
public class 実装クラス名が親クラス名を拡張 インターフェース名1,インターフェース名2を実装する,...{ }
実装クラスが親クラスを継承し、インターフェイスを実装している場合に発生するコンフリクト。
パブリックな静的定数の競合 -> 継承なし パブリックな抽象メソッドの競合 -> 書き換え パブリックなデフォルトメソッドの競合 -> 優先される親 パブリックな静的メソッドの競合 ----> 優先される親 プライベートメソッドの競合 -> 競合なし
親クラスとインタフェースのパブリック静的定数の競合
class Fu{
public static final int a = 10;
}
interface IA{
public static final int a = 20;
}
class Zi extends Fu implements IA{//変数の継承がない
}
public class Demo {
public static void main(String[] args) {
System.out.println(Zi.a);//コンパイル・エラー
}
}
親クラスとインタフェースの抽象メソッドの競合
abstract class Fu{
public abstract void show();
}
interface IA{
public void show();
}
class Zi extends Fu implements IA{// 書き直さなければならない
}
//
main(){
Zi z = new Zi();
z.show();//a
}
親クラスとインタフェースのパブリック・デフォルト・メソッドの競合
class Fu{
public void show(){
System.out.println("a");
}
}
interface IA{
public default void show(){
System.out.println("b");
}
}
class Zi extends Fu implements IA{
}
//
main(){
Zi z = new Zi();
z.show();//a
}
親クラスおよびインターフェースのパブリック静的メソッド
class Fu{
public static void show(){
System.out.println("fu...");
}
}
interface IA{
public static void show(){
System.out.println("IA...");
}
}
class Zi extends Fu implements IA{//親」の静的メソッドのみが継承され、インターフェースの静的メソッドは継承されない。
}
public class Demo {
public static void main(String[] args) {
Zi.show();//fu...
}
}
親クラスとインターフェースのプライベートメソッド
競合なし