インターフェース(interface)とは、ソフトウェア工学において、一般に他者から呼び出されるメソッドや関数を指します。抽象的な概念をさらに一歩進めます。
Javaでは、キーワードinterfaceを通じてインターフェースを定義し、キーワードimplementsを通じてインターフェースを実装します。
インターフェイスは抽象クラスよりも抽象的なため、非常に抽象的なクラスとして理解できます。
例を通してインターフェースの特徴を見てみましょう:
インターフェースを定義する
// 1.接口,访问权限只能是 默认(包访问权限)或 publicpublic interface Parent { // 2.成员变量,准确来说应该叫常量。具有以下特点: // 2.1.访问权限只能是 public (缺省也代表 public) ,修饰符只能是 final & static public final static String WORD = "a"; // 2.2.即使不指定,默认也是被 public fainl static 修饰 String NAME = "b"; // 2.3.不能存在空的 final 变量 ,如 int num; 但是可以被非常量表达式初始化 int num = new Random().nextInt(100); // 3.抽象方法,访问权限只能是 默认(包访问权限)或 public public abstract void print(); abstract void print(int i); // 4.普通方法,访问权限只能是 默认(包访问权限)或 public public void play(); void play(int i); }
インターフェースを実装する
public class Son implements Parent { @Override public void print() { System.out.println("I am Son"); } @Override public void play() { System.out.println("Son is playing"); } }
ネストされたインターフェイスには 2 つの形式があります:
クラス内でインターフェイスを定義する;
インターフェイス内でインターフェイスを定義する。
インターフェースはクラス内でネストされており、次の特徴があります:
インターフェースのアクセス権は制限されず、プライベートを使用して変更できます
メソッド/抽象メソッド/変数のアクセス権は外部インターフェースと一致しています
以下は例を通して検証されます:
public class Demo { // 内部接口 private interface A { void f(); } // 内部类 class AImpl implements A { @Override public void f() { System.out.println("AImpl.f()"); } } A getA(){ return new AImpl(); } private A a; public void receive(A a){ this.a = a; a.f(); } }
その呼び出しプロセスを見てみましょう:
Demo demo = new Demo();// 错误,因为 A 是私有接口,不可被外部访问 // Demo.A a = demo.getA(); // 因为 A 接口不可视,所以只能通过内部类来访问 Demo.AImpl a = (Demo.AImpl) demo.getA();a.f();// 或者是这样 demo.receiveA(demo.getA());
インターフェース内のインターフェースを定義します。呼び出しを除いて、それらは通常のインターフェースと同じです。
public interface Demo { // 内部接口 interface A { void play(); } void print(); }public class DemoImpl implements Demo,Demo.A{ @Override public void play() { System.out.println("DemoImpl.play()"); } @Override public void print() { System.out.println("DemoImpl.print()"); } }public class Test{ public static void main(String[] args) { // 向上转型,只能调用 print() Demo demo = new DemoImpl(); // 向上转型,只能调用 play() Demo.A a = new DemoImpl(); } }
上で述べたように、インターフェースは抽象クラスよりも抽象的なため、非常に抽象的なクラスとして理解できます。
実際の応用では、両者の間にはまだ違いがあります。
抽象クラスには非抽象メソッドを含めることができますが、インターフェイスには抽象メソッドのみが存在できます。
抽象クラスのメンバー変数はさまざまな型にすることができますが、インターフェイスのメンバー変数は public static constants(public static Final) のみにすることができます。
抽象クラスには静的コード ブロックと静的メソッドを含めることができますが、インターフェイスには静的コード ブロックと静的メソッドを含めることはできません。
クラスは1つの抽象クラスのみを継承できますが、クラスは複数のインターフェースを実装できます。
抽象クラスは全体 (プロパティ、動作) を抽象化したものですが、インターフェイスは一部 (動作) を抽象化したものです。
簡単な例を挙げると、飛行機と鳥は異なる種類のものですが、共通点は 1 つあります。それは、飛行できるということです。
デザインする際、飛行機は飛行機風に、鳥は鳥風にデザインできます。
しかし、飛行の特徴はクラスとして設計することができないので、それは単なる行動の特徴であり、物事のクラスの抽象的な記述ではありません。
この時点で、Flight はメソッド fly() を含む Fly インターフェイスとして設計でき、Airplane と Bird はそれぞれ独自のニーズに応じて Fly インターフェイスを実装します。
その後、戦闘機や民間航空機などのさまざまな種類の航空機については、Airplane クラスを直接継承できます。同様に、さまざまな種類の鳥も Bird クラスを直接継承できます。
ここから、継承は「ある」関係であるのに対し、インターフェース実装は「ある」関係であることがわかります。
クラスが抽象クラスを継承する場合、サブクラスは抽象クラスの型である必要があり、インターフェイスの実装は、鳥が飛べるかどうか(または飛ぶ性質があるかどうかなど)の有無に関係します。 , 飛べるならこのインターフェースを実装できます、飛べないならこのインターフェースは実装できません。
上記は 05.Java Basics - Interface の内容です。その他の関連コンテンツについては、PHP 中国語 Web サイト (www.php.cn) に注目してください。