Java インターフェイス
Java インターフェイス
このチュートリアルでは、Java インターフェイスについて学習します。インターフェースを実装する方法と、それらをいつ使用するかについて、例を使用して詳細に学習します。
インターフェースは完全に抽象化されたクラスです。これには、抽象メソッド (本体のないメソッド) のグループが含まれます。
interface
を使用します Java でインターフェイスを作成するためのキーワード。たとえば、
interface Language {
public void getType();
public void getVersion();
}
ここで、
- 言語 インターフェースです。
- 抽象メソッドが含まれています:
getType()
そしてgetVersion()
.
インターフェースの実装
抽象クラスと同様に、インターフェースのオブジェクトを作成することはできません。
インターフェイスを使用するには、他のクラスがそれを実装する必要があります。 implements
を使用します インターフェイスを実装するためのキーワード。
例 1:Java インターフェイス
interface Polygon {
void getArea(int length, int breadth);
}
// implement the Polygon interface
class Rectangle implements Polygon {
// implementation of abstract method
public void getArea(int length, int breadth) {
System.out.println("The area of the rectangle is " + (length * breadth));
}
}
class Main {
public static void main(String[] args) {
Rectangle r1 = new Rectangle();
r1.getArea(5, 6);
}
}
出力
The area of the rectangle is 30
上記の例では、Polygon という名前のインターフェースを作成しました。 .インターフェイスには抽象メソッド getArea()
が含まれています .
ここでは、長方形 クラスは Polygon を実装します .そして、getArea()
の実装を提供します メソッド。
例 2:Java インターフェイス
// create an interface
interface Language {
void getName(String name);
}
// class implements interface
class ProgrammingLanguage implements Language {
// implementation of abstract method
public void getName(String name) {
System.out.println("Programming Language: " + name);
}
}
class Main {
public static void main(String[] args) {
ProgrammingLanguage language = new ProgrammingLanguage();
language.getName("Java");
}
}
出力
Programming Language: Java
上記の例では、Language という名前のインターフェースを作成しました。 .インターフェイスには抽象メソッド getName()
が含まれています .
ここでは、プログラミング言語 クラスはインターフェースを実装し、メソッドの実装を提供します。
複数のインターフェースの実装
Java では、クラスは複数のインターフェースを実装することもできます。たとえば、
interface A {
// members of A
}
interface B {
// members of B
}
class C implements A, B {
// abstract members of A
// abstract members of B
}
インターフェースの拡張
クラスと同様に、インターフェイスは他のインターフェイスを拡張できます。 extends
キーワードは、インターフェースを拡張するために使用されます。たとえば、
interface Line {
// members of Line interface
}
// extending interface
interface Polygon extends Line {
// members of Polygon interface
// members of Line interface
}
ここでは、ポリゴン インターフェイスは Line を拡張します インターフェース。ここで、Polygon を実装するクラスがある場合 、両方の Line のすべての抽象メソッドの実装を提供する必要があります と ポリゴン .
複数のインターフェースの拡張
インターフェイスは、複数のインターフェイスを拡張できます。たとえば、
interface A {
...
}
interface B {
...
}
interface C extends A, B {
...
}
Java インターフェイスの利点
インターフェースとは何かがわかったので、Java でインターフェースが使用される理由について学びましょう。
- 抽象クラスと同様に、インターフェースは Java での抽象化の実現に役立ちます .
ここで、getArea()
がわかります ポリゴンの面積を計算しますが、面積の計算方法はポリゴンによって異なります。したがって、getArea()
の実装 互いに独立しています。 - インターフェース 仕様を提供 クラス(それを実装する)が従わなければならないこと。
前の例では、getArea()
を使用しました。 インターフェイス Polygon 内の仕様として .これは、すべてのポリゴンの面積を取得できるようにするルールを設定するようなものです。
Polygon を実装するすべてのクラス インターフェイスはgetArea()
の実装を提供する必要があります メソッド。 - インターフェースは、Java で多重継承を実現するためにも使用されます。例えば、
interface Line { … } interface Polygon { … } class Rectangle implements Line, Polygon { … }
ここでは、クラス Rectangle 2 つの異なるインターフェイスを実装しています。これが、Java で多重継承を実現する方法です。
注意 :インターフェイス内のすべてのメソッドは暗黙的に public
です すべてのフィールドは暗黙的に public static final
です .たとえば、
interface Language {
// by default public static final
String type = "programming language";
// by default public
void getName();
}
Java インターフェイスのデフォルト メソッド
Java 8 のリリースにより、インターフェース内に実装されたメソッドを追加できるようになりました。これらのメソッドはデフォルト メソッドと呼ばれます。
インターフェイス内でデフォルトのメソッドを宣言するには、default
を使用します キーワード。たとえば、
public default void getSides() {
// body of getSides()
}
デフォルトのメソッドを使用する理由
デフォルトのメソッドが Java に導入された理由を理解するためのシナリオを考えてみましょう。
インターフェイスに新しいメソッドを追加する必要があるとします。
実装せずに簡単にインターフェイスにメソッドを追加できます。しかし、これで話は終わりではありません。そのインターフェースを実装するすべてのクラスは、メソッドの実装を提供する必要があります。
多数のクラスがこのインターフェースを実装していた場合、これらすべてのクラスを追跡して変更を加える必要があります。これは面倒なだけでなく、エラーが発生しやすくなります。
これを解決するために、Java はデフォルトのメソッドを導入しました。デフォルトのメソッドは、通常のメソッドと同様に継承されます。
デフォルトのメソッドをよりよく理解するために、例を挙げてみましょう。
例:Java インターフェイスのデフォルト メソッド
interface Polygon {
void getArea();
// default method
default void getSides() {
System.out.println("I can get sides of a polygon.");
}
}
// implements the interface
class Rectangle implements Polygon {
public void getArea() {
int length = 6;
int breadth = 5;
int area = length * breadth;
System.out.println("The area of the rectangle is " + area);
}
// overrides the getSides()
public void getSides() {
System.out.println("I have 4 sides.");
}
}
// implements the interface
class Square implements Polygon {
public void getArea() {
int length = 5;
int area = length * length;
System.out.println("The area of the square is " + area);
}
}
class Main {
public static void main(String[] args) {
// create an object of Rectangle
Rectangle r1 = new Rectangle();
r1.getArea();
r1.getSides();
// create an object of Square
Square s1 = new Square();
s1.getArea();
s1.getSides();
}
}
出力
The area of the rectangle is 30 I have 4 sides. The area of the square is 25 I can get sides of a polygon.
上記の例では、Polygon という名前のインターフェースを作成しました。 .デフォルトのメソッド getSides()
があります および抽象メソッド getArea()
.
ここでは、2 つのクラス Rectangle を作成しました。 そしてスクエア Polygon を実装する .
長方形 クラスは getArea()
の実装を提供します メソッドと getSides()
をオーバーライドします 方法。ただし、スクエア クラスは getArea()
の実装のみを提供します メソッド。
さて、getSides()
を呼び出しながら Rectangle を使用したメソッド オブジェクト、オーバーライドされたメソッドが呼び出されます。ただし、Square の場合は オブジェクト、デフォルトのメソッドが呼び出されます。
インターフェイスのプライベート メソッドと静的メソッド
Java 8 では、インターフェイス内に静的メソッドを含める別の機能も追加されました。
クラスと同様に、参照を使用してインターフェイスの静的メソッドにアクセスできます。たとえば、
// create an interface
interface Polygon {
staticMethod(){..}
}
// access static method
Polygon.staticMethod();
注意 :Java 9 のリリースにより、プライベート メソッドもインターフェイスでサポートされます。
インターフェイスのオブジェクトを作成することはできません。したがって、プライベート メソッドは、インターフェース内の他のメソッドをサポートするヘルパー メソッドとして使用されます。
インターフェースの実際の例
Java インターフェイスのより実用的な例を見てみましょう。
// To use the sqrt function
import java.lang.Math;
interface Polygon {
void getArea();
// calculate the perimeter of a Polygon
default void getPerimeter(int... sides) {
int perimeter = 0;
for (int side: sides) {
perimeter += side;
}
System.out.println("Perimeter: " + perimeter);
}
}
class Triangle implements Polygon {
private int a, b, c;
private double s, area;
// initializing sides of a triangle
Triangle(int a, int b, int c) {
this.a = a;
this.b = b;
this.c = c;
s = 0;
}
// calculate the area of a triangle
public void getArea() {
s = (double) (a + b + c)/2;
area = Math.sqrt(s*(s-a)*(s-b)*(s-c));
System.out.println("Area: " + area);
}
}
class Main {
public static void main(String[] args) {
Triangle t1 = new Triangle(2, 3, 4);
// calls the method of the Triangle class
t1.getArea();
// calls the method of Polygon
t1.getPerimeter(2, 3, 4);
}
}
出力
Area: 2.9047375096555625 Perimeter: 9
上記のプログラムでは、Polygon という名前のインターフェイスを作成しました。 .デフォルトのメソッド getPerimeter()
が含まれています および抽象メソッド getArea()
.
すべてのポリゴンの周長を同じ方法で計算できるので、 getPerimeter()
の本体を実装しました ポリゴンで .
これで、Polygon を実装するすべてのポリゴンが getPerimeter()
を使用できます 周長を計算します。
ただし、面積を計算するためのルールは、ポリゴンごとに異なります。したがって、getArea()
実装なしで含まれています。
Polygon を実装するクラス getArea()
の実装を提供する必要があります .
Java