- インターフェース
- インターフェース例
- インターフェースによる多重継承
- インターフェースでは多重継承がサポートされているのに、クラスでは多重継承がサポートされていないのはなぜですか。
- マーカーインターフェース
- ネストされたインターフェース
アン Javaのインターフェース クラスの設計図です。静的定数と抽象メソッドがあります。
Javaのインターフェースは、 達成するための仕組み 抽象化 。 Java インターフェースには抽象メソッドのみが存在でき、メソッド本体は存在できません。抽象化と複数の機能を実現するために使用されます。 Javaの継承 。
言い換えれば、インターフェイスには抽象メソッドと変数を含めることができると言えます。メソッド本体を持つことはできません。
Javaインターフェースも IS-A関係を表します 。
抽象クラスと同様にインスタンス化することはできません。
Java 8 以降では、次のようにすることができます。 デフォルトメソッドと静的メソッド インターフェースで。
Java 9 以降では、次のようにすることができます。 プライベートメソッド インターフェースで。
なぜ Java インターフェースを使用するのでしょうか?
インターフェースを使用する理由は主に 3 つあります。それらを以下に示します。
- 抽象化を実現するために使用されます。
- インターフェイスによって、多重継承の機能をサポートできます。
- 疎結合を実現するために使用できます。
インターフェイスを宣言するにはどうすればよいですか?
インターフェイスは、interface キーワードを使用して宣言されます。それは完全な抽象化を提供します。これは、インターフェイス内のすべてのメソッドが空の本体で宣言され、すべてのフィールドがデフォルトで public、static、final であることを意味します。インターフェイスを実装するクラスは、インターフェイスで宣言されたすべてのメソッドを実装する必要があります。
構文:
interface { // declare constant fields // declare methods that abstract // by default. }
Java 8 インターフェースの改善
以来 Java 8 、インターフェースにはデフォルトメソッドと静的メソッドを含めることができますが、これについては後で説明します。
コンパイラによる内部加算
Java コンパイラは、インターフェイス メソッドの前に public キーワードと abstract キーワードを追加します。さらに、データ メンバーの前に public、static、final キーワードを追加します。
つまり、インターフェイス フィールドはデフォルトで public、static、final であり、メソッドは public で abstract です。
クラスとインターフェースの関係
以下の図に示すように、クラスは別のクラスを拡張し、インターフェイスは別のインターフェイスを拡張しますが、 クラスはインターフェースを実装します 。
Javaインターフェースの例
この例では、Printable インターフェイスにはメソッドが 1 つだけあり、その実装は A6 クラスで提供されます。
Javaのxor
interface printable{ void print(); } class A6 implements printable{ public void print(){System.out.println('Hello');} public static void main(String args[]){ A6 obj = new A6(); obj.print(); } }今すぐテストしてください
出力:
Hello
Java インターフェイスの例: ドローアブル
この例では、Drawable インターフェイスにはメソッドが 1 つだけあります。その実装は Rectangle クラスと Circle クラスによって提供されます。実際のシナリオでは、インターフェイスは他の人によって定義されますが、その実装は別の実装プロバイダーによって提供されます。しかも他人に使われてしまう。実装部分はインターフェースを使用するユーザーには隠されます。
ファイル: TestInterface1.java
//Interface declaration: by first user interface Drawable{ void draw(); } //Implementation: by second user class Rectangle implements Drawable{ public void draw(){System.out.println('drawing rectangle');} } class Circle implements Drawable{ public void draw(){System.out.println('drawing circle');} } //Using interface: by third user class TestInterface1{ public static void main(String args[]){ Drawable d=new Circle();//In real scenario, object is provided by method e.g. getDrawable() d.draw(); }}今すぐテストしてください
出力:
drawing circle
Java インターフェイスの例: 銀行
Bank インターフェースの実装を提供する Java インターフェースの別の例を見てみましょう。
ファイル: TestInterface2.java
interface Bank{ float rateOfInterest(); } class SBI implements Bank{ public float rateOfInterest(){return 9.15f;} } class PNB implements Bank{ public float rateOfInterest(){return 9.7f;} } class TestInterface2{ public static void main(String[] args){ Bank b=new SBI(); System.out.println('ROI: '+b.rateOfInterest()); }}今すぐテストしてください
出力:
ROI: 9.15
インターフェースによるJavaの多重継承
クラスが複数のインターフェイスを実装している場合、またはインターフェイスが複数のインターフェイスを拡張している場合、それは多重継承と呼ばれます。
interface Printable{ void print(); } interface Showable{ void show(); } class A7 implements Printable,Showable{ public void print(){System.out.println('Hello');} public void show(){System.out.println('Welcome');} public static void main(String args[]){ A7 obj = new A7(); obj.print(); obj.show(); } }今すぐテストしてください
Output:Hello Welcome
Q) 多重継承は Java のクラスではサポートされていませんが、インターフェイスでは可能です。なぜですか?
継承の章で説明したように、次の場合には多重継承はサポートされません。 クラス 曖昧さのため。ただし、インターフェイスの場合はあいまいさがないためサポートされます。これは、その実装が実装クラスによって提供されるためです。例えば:
interface Printable{ void print(); } interface Showable{ void print(); } class TestInterface3 implements Printable, Showable{ public void print(){System.out.println('Hello');} public static void main(String args[]){ TestInterface3 obj = new TestInterface3(); obj.print(); } }今すぐテストしてください
出力:
Hello
上の例でわかるように、Printable インターフェイスと Showable インターフェイスには同じメソッドがありますが、その実装はクラス TestTnterface1 によって提供されるため、あいまいさはありません。
インターフェースの継承
クラスはインターフェイスを実装しますが、あるインターフェイスは別のインターフェイスを拡張します。
interface Printable{ void print(); } interface Showable extends Printable{ void show(); } class TestInterface4 implements Showable{ public void print(){System.out.println('Hello');} public void show(){System.out.println('Welcome');} public static void main(String args[]){ TestInterface4 obj = new TestInterface4(); obj.print(); obj.show(); } }今すぐテストしてください
出力:
Hello Welcome
インターフェースの Java 8 デフォルトメソッド
Java 8 以降、インターフェイスにメソッド本体を含めることができます。ただし、それをデフォルトの方法にする必要があります。例を見てみましょう:
Javaのインスタンス化
ファイル: TestInterfaceDefault.java
interface Drawable{ void draw(); default void msg(){System.out.println('default method');} } class Rectangle implements Drawable{ public void draw(){System.out.println('drawing rectangle');} } class TestInterfaceDefault{ public static void main(String args[]){ Drawable d=new Rectangle(); d.draw(); d.msg(); }}今すぐテストしてください
出力:
drawing rectangle default method
インターフェースの Java 8 静的メソッド
Java 8 以降、インターフェイスに静的メソッドを含めることができます。例を見てみましょう:
ファイル: TestInterfaceStatic.java
interface Drawable{ void draw(); static int cube(int x){return x*x*x;} } class Rectangle implements Drawable{ public void draw(){System.out.println('drawing rectangle');} } class TestInterfaceStatic{ public static void main(String args[]){ Drawable d=new Rectangle(); d.draw(); System.out.println(Drawable.cube(3)); }}今すぐテストしてください
出力:
drawing rectangle 27
Q) マーカーまたはタグ付きインターフェースとは何ですか?
メンバーを持たないインターフェイスは、マーカーまたはタグ付きインターフェイスと呼ばれます。たとえば、次のようになります。 シリアル化可能 、クローン可能、リモートなど。これらは、JVM が何らかの有用な操作を実行できるように、JVM にいくつかの重要な情報を提供するために使用されます。
//How Serializable interface is written? public interface Serializable{ }
Java の入れ子になったインターフェイス
注: インターフェイスには、ネストされたインターフェイスと呼ばれる別のインターフェイスを含めることができます。で詳しく学びます 入れ子になったクラス 章。例えば:
interface printable{ void print(); interface MessagePrintable{ void msg(); } }ネストされたインターフェイスの詳細