web-dev-qa-db-ja.com

Javaのインターフェースとは何ですか?

この質問 への対置としてちょうど:Javaのインターフェースとは何ですか?

32
Imagist

インターフェイスは、メソッドを実装しない抽象クラスの特殊な形式です。 Javaでは、次のようなインターフェースを作成します。

_interface Interface
{
    void interfaceMethod();
}
_

インターフェースはメソッドを実装できないため、すべてのメソッドを含む全体がパブリックと抽象の両方であることを意味します(Javaの抽象用語は「このクラスによって実装されていない」ことを意味します) 。したがって、上記のインターフェースは以下のインターフェースと同じです。

_public interface Interface
{
    abstract public void interfaceMethod();
}
_

このインターフェースを使用するには、インターフェースを実装するだけです。多くのクラスはインターフェースを実装でき、クラスは多くのインターフェースを実装できます。

_interface InterfaceA
{
     void interfaceMethodA();
}

interface InterfaceB
{
    void interfaceMethodB();
}

public class ImplementingClassA
    implements InterfaceA, InterfaceB
{
    public void interfaceMethodA()
    {
        System.out.println("interfaceA, interfaceMethodA, implementation A");
    }

    public void interfaceMethodB()
    {
        System.out.println("interfaceB, interfaceMethodB, implementation A");
    }
}

public class ImplementingClassB
    implements InterfaceA, InterfaceB
{
    public void interfaceMethodA()
    {
         System.out.println("interfaceA, interfaceMethodA, implementation B");
    }

    public void interfaceMethodB()
    {
        System.out.println("interfaceB, interfaceMethodB, implementation B");
    }
}
_

必要に応じて、次のようなメソッドを記述できます。

_public void testInterfaces()
{
    ImplementingClassA u = new ImplementingClassA();
    ImplementingClassB v = new ImplementingClassB();
    InterfaceA w = new ImplementingClassA();
    InterfaceA x = new ImplementingClassB();
    InterfaceB y = new ImplementingClassA();
    InterfaceB z = new ImplementingClassB();

    u.interfaceMethodA();
    // prints "interfaceA, interfaceMethodA, implementation A"
    u.interfaceMethodB();
    // prints "interfaceB, interfaceMethodB, implementation A"
    v.interfaceMethodA();
    // prints "interfaceA, interfaceMethodA, implementation B"
    v.interfaceMethodB();
    // prints "interfaceB, interfaceMethodB, implementation B"
    w.interfaceMethodA();
    // prints "interfaceA, interfaceMethodA, implementation A"
    x.interfaceMethodA();
    // prints "interfaceA, interfaceMethodA, implementation B"
    y.interfaceMethodB();
    // prints "interfaceB, interfaceMethodB, implementation A"
    z.interfaceMethodB();
    // prints "interfaceB, interfaceMethodB, implementation B"
}
_

ただし、次のことはneverで行うことができます。

_public void testInterfaces()
{
    InterfaceA y = new ImplementingClassA();
    InterfaceB z = new ImplementingClassB();

    y.interfaceMethodB(); // ERROR!
    z.interfaceMethodA(); // ERROR!
}
_

これを実行できない理由は、yinterfaceAタイプであり、interfaceAinterfaceMethodB()がないためです。同様に、zinterfaceBタイプであり、interfaceBにはinterfaceMethodA()がありません。

インターフェースは、抽象クラスの特殊な形式にすぎないと、先に述べました。その点を説明するために、次のコードを見てください。

_interface Interface
{
    void abstractMethod();
}

abstract public class AbstractClass
{
    abstract public void abstractMethod();
}
_

これらのクラスからほぼ同じ方法で継承します。

_public class InheritsFromInterface
    implements Interface
{
    public void abstractMethod() { System.out.println("abstractMethod()"); }
}

public class InteritsFromAbstractClass
    extends AbstractClass
{
    public void abstractMethod() { System.out.println("abstractMethod()"); }
}
_

実際、次のようにインターフェイスと抽象クラスを変更することもできます。

_interface Interface
{
    void abstractMethod();
}

abstract public class AbstractClass
    implements Interface
{
    abstract public void abstractMethod();
}

public class InheritsFromInterfaceAndAbstractClass
    extends AbstractClass implements Interface
{
    public void abstractMethod() { System.out.println("abstractMethod()"); }
}
_

ただし、インターフェイスと抽象クラスには2つの違いがあります。

最初の違いは、インターフェースがメソッドを実装できないことです。

_interface Interface
{
    public void implementedMethod()
    {
        System.out.println("implementedMethod()");
    }
}
_

上記のインターフェイスは、implementedMethod()の実装があるため、コンパイラエラーを生成します。メソッドを実装したいがクラスをインスタンス化できない場合は、次のようにする必要があります。

_abstract public class AbstractClass
{
    public void implementedMethod()
    {
        System.out.println("implementedMethod()");
    }
}
_

どのメンバーも抽象的ではないため、これは抽象クラスではありませんが、正当なJavaです。

インターフェースと抽象クラスのもう1つの違いは、クラスは複数のインターフェースから継承できるが、1つの抽象クラスからしか継承できないことです。

_abstract public class AbstractClassA { }
abstract public class AbstractClassB { }
public class InheritsFromTwoAbstractClasses
    extends AbstractClassA, AbstractClassB
{ }
_

上記のコードは、クラスがすべて空ではないためではなく、InheritsFromTwoAbstractClassesが2つの抽象クラスから継承しようとしているため、コンパイラエラーを生成しますが、これは不正です。以下は完全に合法です。

_interface InterfaceA { }
interface InterfaceB { }
public class InheritsFromTwoInterfaces
    implements InterfaceA, InterfaceB
{ }    
_

インターフェースと抽象クラスの最初の違いは、2番目の違いの理由です。次のコードを見てください。

_interface InterfaceA
{
    void method();
}

interface InterfaceB
{
    void method();
}

public class InheritsFromTwoInterfaces
    implements InterfaceA, InterfaceB
{
    void method() { System.out.println("method()"); }
}
_

InterfaceAInterfaceBには非表示にするものがないため、上記のコードに問題はありません。 methodを呼び出すと「method()」が出力されることは簡単にわかります。

次のコードを見てください。

_abstract public class AbstractClassA
{
    void method() { System.out.println("Hello"); }
}

abstract public class AbstractClassB
{
    void method() { System.out.println("Goodbye"); }
}

public class InheritsFromTwoAbstractClasses
    extends AbstractClassA, AbstractClassB
{ }
_

これは、他の例とまったく同じですが、抽象クラスでメソッドを実装できるため、実装済みであり、継承クラスで既に実装されているメソッドを実装する必要がないため、実装していません。しかし、気づいたかもしれませんが、問題があります。 new InheritsFromTwoAbstractClasses().method()を呼び出すとどうなりますか? 「こんにちは」または「さようなら」を印刷しますか? Javaコンパイラもそうではありません。別の言語では、C++はこの種の継承を許可し、非常に複雑な方法でこれらの問題を解決しました。この種の回避するにはトラブル、Javaこの「多重継承」を違法とすることにしました。

次のことができないJavaのソリューションの欠点:

_abstract public class AbstractClassA
{
    void hi() { System.out.println("Hello"); }
}

abstract public class AbstractClassB
{
    void bye() { System.out.println("Goodbye"); }
}

public class InheritsFromTwoAbstractClasses
    extends AbstractClassA, AbstractClassB
{ }
_

AbstractClassAおよびAbstractClassBは「ミックスイン」またはインスタンス化することを意図していないクラスですが、継承によって「ミックスイン」されるクラスに機能を追加します。 new InheritsFromTwoAbstractClasses().hi()またはnew InheritsFromTwoAbstractClasses().bye()を呼び出すとどうなるかを理解するのに明らかに問題はありませんが、Javaが許可していないため、それを行うことはできません。 。

(私はこれが長い記事であることを知っているので、それに間違いがあれば私に知らせてください、そして私はそれらを修正します。)

52
Imagist

インターフェイスは契約です。簡単なexampleTenantLandlordであり、これらはthe two partycontractです。 =は家賃契約です。賃貸契約には、テナントが従わなければならないさまざまな条項が含まれています。同様に、インターフェイスは、パーティーが実装する必要のあるさまざまなメソッド(宣言)を含む連絡先です(メソッド本体を提供します)。インターフェース」および「実装クラスのオブジェクト」:以下は3つのコンポーネントです(例を使用して説明)

コンポーネント1]インターフェース:契約

interface myInterface{

 public void myMethod();

 }

コンポーネント2]実装クラス:パーティー番号1

 class myClass implements myInterface {

 @Override

 public void myMethod() {

 System.out.println("in MyMethod");

 }

 }

コンポーネント3]クライアントコード:パーティー番号2

 Client.Java

 public class Client {

 public static void main(String[] args) {

 myInterface mi = new myClass();

 // Reference of Interface = Object of Implementing Class

 mi.myMethod(); // this will print in MyMethod

 }

 }
1
Shashank Bodkhe

インターフェースは、定数と抽象メソッドのみを含むクラスのような構造です(Java programming、ndの概要)。さらに、スーパークラスなど、複数のインターフェースを拡張できます。Javaは、クラス拡張の単一継承のみを許可しますが、インターフェースの複数の拡張を許可します(Java programming、nd)の概要)たとえば、

public class NewClass extends BaseClass
implements Interface1, ..., InterfaceN {
    ...
}

次に、インターフェイスを使用して、クラス内のオブジェクトの動作を指定できます。ただし、抽象メソッドを含めることはできません。また、インターフェイスはextendsキーワードを使用して他のインターフェイスを継承できます。

public interface NewInterface extends Interface1, ... , InterfaceN {

}

参照

Javaプログラミングの概要。インターフェイスと抽象クラス(n.d)。2017年3月10日 https://viewer.gcu.edu/7NNUKW から取得

0
FREDDYSMALLZ

Oracle による最新の定義から、インターフェースは次のとおりです。

さまざまなプログラマグループが、ソフトウェアの相互作用を表現する「契約」に同意することが重要である場合、ソフトウェアエンジニアリングには多くの状況があります 。各グループは、他のグループのコードがどのように記述されているかをまったく知らなくても、コードを記述できる必要があります。一般的に言って、インターフェースはそのような契約です。

たとえば、コンピューター制御のロボット車が人間のオペレーターなしで街の通りを乗客を輸送する未来の社会を想像してみてください。自動車メーカーは、自動車を操作するソフトウェア(Javaはもちろん)を作成します(停止、始動、加速、左折など)。別の産業グループである電子案内機器メーカーは、GPS(全地球測位システム)位置データと交通状況のワイヤレス送信を受信し、その情報を使用して車を運転するコンピューターシステムを製造しています。

自動車メーカーは、自動車を動かすために呼び出すことができるメソッド(自動車、メーカーを問わず)を詳しく説明する業界標準のインターフェースを公開する必要があります。ガイダンスの製造元は、インターフェイスに記述されているメソッドを呼び出して車に命令するソフトウェアを作成できます。どちらの産業グループも、他のグループのソフトウェアがどのように実装されているかを知る必要はありません。実際、各グループはそのソフトウェアを非常に独占的であると見なし、公開されたインターフェースを順守している限り、いつでもソフトウェアを変更する権利を留保します。

[...]インターフェイスは、クラスに似た参照型であり、定数、メソッドシグネチャ、デフォルトメソッド、静的メソッド、およびネストされた型のみを含むことができます。メソッド本体は、デフォルトのメソッドと静的メソッドにのみ存在します。インターフェイスをインスタンス化することはできません。クラスによって実装するか、他のインターフェイスによって拡張することしかできません。

インターフェースの最も一般的な使用法は、商用ソフトウェア製品で一般的なAPI(アプリケーションプログラミングインターフェース)です。通常、企業は、別の企業が自社のソフトウェア製品で使用したい複雑なメソッドを含むソフトウェアパッケージを販売しています。

例としては、エンドユーザーグラフィックスプログラムを作成する企業に販売されるデジタル画像処理方法のパッケージがあります。

画像処理会社は、顧客に公開するインターフェースを実装するクラスを作成します。次に、グラフィック企業は、インターフェイスで定義された署名と戻り値の型を使用して画像処理メソッドを呼び出します。画像処理会社のAPIは(顧客に)公開されますが、APIの実装は厳重に保護された秘密として保持されます。実際、元のインターフェースを引き続き実装している限り、実装は後日改訂される可能性があります。その顧客が信頼していること。

インターフェースの詳細 をご覧ください。

0
Johnny

この質問は6年前のものであり、長年にわたって多くのことがインターフェースの定義を変えてきました。

Oracleから ドキュメント ページ(post Java 8 release):

Javaプログラミング言語では、インターフェースはクラスに似た参照型であり、定数、メソッドシグネチャ、デフォルトメソッド、静的メソッドのみを含めることができます) 、およびネストされたタイプメソッド本体は、デフォルトのメソッドと静的メソッドにのみ存在します。インターフェースはインスタンス化できません。これらはクラスによって実装するか、他のインターフェースによって拡張することしかできません。

より詳しい説明については、関連するSEの質問をご覧ください。

正しいメソッドを持つことよりもインターフェースに多くのものがあります

インターフェースと抽象クラスの違いは何ですか?

0
Ravindra babu

概要
インターフェースは、クラスです。これらは、Javaの2つの主要な参照型です。

内容
インターフェイスには、通常のクラス含めることができます。これには、static、メソッドと変数の両方、およびnonstaticメソッド宣言が含まれます。 static以外の変数を含めることはできません。
メソッドの宣言は、いくつかの点で通常のメソッドと異なります。以下に例を示します。

[public] [abstract] ReturnType methodName();

これらの宣言は、[optional braces]で表されるように、publicおよびabstractとしてマークできます。これはデフォルトであるため、そうする必要はありません。 privateprotectedpackage-private(別名。なし)およびfinal修飾子は許可されず、コンパイラエラーとしてマークされます。これらは実装されていないため、中括弧の代わりにセミコロンがあります。

Java 8以降)、canstaticメソッドwith実装では、これらはdefault修飾子でマークする必要があります。ただし、他の修飾子と同じ制限が適用されます(strictfpが有効になり、abstractがなくなる)。

何に役立つか
その用途の1つは、サービスの顔として使用することです。 2つのパーティが協力してサービスリクエスターとサービスプロバイダーのような関係を形成する場合、サービスプロバイダーは、サービスの外観(サービスの外観)をインターフェイスの形で提供します。
OOPコンセプトの1つは「抽象化」です。これは、システムの複雑な動作を隠し、システムを理解するために必要なものだけを示すことを意味します。これは動作を視覚化するのに役立ちます複雑なシステムの場合、これはinterfaceを介して実現できます。各モジュールでは、別のモジュールのインターフェースを介して機能するように視覚化(および実装)されます

0
S R Chaitanya

インターフェースはクラスの設計図です。

データ抽象化と呼ばれる1つのoopの概念があり、その下には2つのカテゴリー抽象クラ​​スともう1つはインターフェースの2つのカテゴリーがあります。

抽象クラスは部分的な抽象化のみを実現しますが、インターフェースは完全な抽象化を実現します。

インターフェースには、抽象メソッドと最終変数しかありません。インターフェースはいくつでも拡張でき、クラスはいくつでも実装できます。

いずれかのクラスがインターフェースを実装している場合、そのクラスは抽象メソッドも実装する必要があります

インターフェイスをインスタンス化できません。

interface A() {
    void print()
}
0
Revathi Bala

インターフェースJavaは、クラスの青写真です。静的定数と抽象メソッドのみがあります。Javaのインターフェイスは、完全に抽象化するためのメカニズムです。 Javaインターフェイスには、メソッド本体ではなく、抽象メソッドのみを含めることができます。 Javaで完全な抽象化と多重継承を実現するために使用されます。インターフェイスは、抽象メソッドのコレクションです。クラスはインターフェースを実装し、それによりインターフェースの抽象メソッドを継承します。インターフェイスはクラスではありません。インターフェースの作成はクラスの作成に似ていますが、それらは2つの異なる概念です。クラスは、オブジェクトの属性と動作を記述します。インターフェイスには、クラスが実装する動作(抽象メソッド)が含まれています。インターフェースを実装するクラスが抽象クラスでない限り、インターフェースのすべてのメソッドをクラスで定義する必要があります。Javaでは多重継承が許可されていないため、インターフェースは多重継承を実装する唯一の方法ですこれはインターフェースを理解するための例です

interface Printable{  
void print();  
}  

interface Showable{  
void print();  
}  

class testinterface1 implements Printable,Showable{  

public void print(){System.out.println("Hello");}  

public static void main(String args[]){  
testinterface1 obj = new testinterface1();  
obj.print();  
 }  
}
0
Ketan G

一般に、実装が2つ以上ある場合は、インターフェースを優先します。インターフェイスはプロトコルとして機能します。

実装ではなく、インターフェースへのコーディングインターフェースへのコーディングは疎結合になります。

インターフェースはJavaの参照型です。クラスに似ています。抽象メソッドのコレクションです。クラスはインターフェースを実装し、それによりインターフェースの抽象メソッドを継承します。抽象メソッドに加えて、インターフェイスには定数、デフォルトメソッド、静的メソッド、およびネストされた型が含まれる場合もあります。詳細 詳細

0
Premraj