比較表
比較基準 | クラス | インタフェース |
---|---|---|
基本 | クラスは、オブジェクトを作成するためにインスタンス化されます。 | メソッドは起動時にアクションを実行できないため、インターフェイスをインスタンス化することはできません。 |
キーワード | クラス | インタフェース |
アクセス指定子 | クラスのメンバーは、非公開、公開、保護のいずれでもかまいません。 | インターフェースのメンバーは常に公開されています。 |
方法 | クラスのメソッドは特定のアクションを実行するように定義されています。 | インタフェースのメソッドは純粋に抽象的です。 |
実装/拡張 | クラスは任意の数のインタフェースを実装でき、1つのクラスのみを拡張できます。 | インターフェイスは複数のインターフェイスを拡張できますが、インターフェイスを実装することはできません。 |
コンストラクタ | クラスは変数を初期化するためのコンストラクタを持つことができます。 | 初期化する変数はほとんどないため、インターフェイスにコンストラクタを含めることはできません。 |
クラスの定義
クラスは、Javaプログラムを実装できないクラスがないと、Javaプログラミングの最も重要な側面です。 クラスは参照型を作成し、これらの参照型はオブジェクトの作成に使用されます。 クラスには署名と本体があります。 クラスの署名には、クラスの名前と、そのクラスが別のクラスを継承したかどうかを示す情報があります。 クラスの本体には、フィールドとそれらのフィールドを操作するメソッドがあります。 クラスはキーワードクラスを使用して作成されます。 クラスを宣言する方法を見てみましょう。
クラスclass_name {/ * fields ... methods * /}
クラスがインスタンス化されると、作成された各オブジェクトにはフィールドとメソッドのコピーが含まれます。 クラス内で宣言されたフィールドとメンバは、静的または非静的にすることができます。 静的メンバーの値は各オブジェクトに対して一定であるのに対して、非静的メンバーは各オブジェクトによってその要件に従って異なる方法で初期化されます。
クラスのメンバーは、ユーザーまたはサブクラスに対するメンバーの可視性とアクセス可能性を決定するアクセス指定子を持ちます。 アクセス指定子は、public、private、およびprotectedです。 サブクラス(継承クラス)内のスーパークラス(継承クラス)のメンバーの可視性を決定するアクセス指定子を使用して、クラスを別のクラスに継承することができます。 したがって、クラスは、オブジェクト指向プログラミングにおけるデータ隠蔽およびカプセル化の概念を満たしています。
インタフェースの定義
インタフェースも、Javaで定義されている参照型の1つです。 インターフェースの重要性は、Javaでは、クラスは単一のクラスしか継承できないことです。 この制限を回避するために、Javaの設計者はインタフェースの概念を導入しました。 インターフェースは構文的にはクラスと似ていますが、フィールド宣言がなく、インターフェース内のメソッドには実装がありません。 インターフェースはキーワードインターフェースを使用して宣言されます 。 インターフェイスの宣言を見てみましょう。
interface interface_name {type var_name = value; type method 1(パラメータリスト)。 type method 2(パラメータリスト)。 。 。 }
インターフェースは、その中で宣言されたメソッドを定義しません。なぜならそれは操作するフィールドがないからです。 インタフェース内のどのメソッドもアクションを実行しないという理由だけで、インタフェースをインスタンス化することはできません。 インタフェースにフィールドメンバがある場合は、宣言時に初期化する必要があります。 初期化するためのフィールドメンバがないため、インタフェースにコンストラクタが含まれることはありません。 そのため、インターフェースは、クラスが実行しなければならないことの代わりに、クラスが実行しなければならないことを定義するだけです。
一度作成されたインタフェースは、キーワードimplementsを使用して、任意の数のクラスで実装できます。 しかし、インターフェースを実装するクラスは、インターフェース内のすべてのメソッドを定義しなければなりません。 インターフェースはextendキーワードを使って他のインターフェースを継承することもできます。 クラスが他のインタフェースを拡張するインタフェースを実装している場合。 その場合、クラスはチェーンに現れる両方のインタフェースのメソッドを定義しなければなりません。 インタフェース内のメソッドは、それらを実装しているクラスからアクセスされる必要があるため、常にパブリックである必要があります。
Javaのクラスとインタフェースの主な違い
- クラスはそのオブジェクトを作成することによってインスタンス化することができます。 インターフェース内で宣言されたメソッドは抽象的でアクションを実行しないため、インターフェースがインスタンス化されることはありません。したがって、インターフェースをインスタンス化する必要はありません。
- クラスはキーワードクラスを使用して宣言されます。 同様に、キーワードインタフェースを使用してインタフェースが作成されます。
- クラスのメンバーは、public、private、protectedなどのアクセス指定子を持つことができます。 しかし、インターフェースのメンバーは、それらを実装しているクラスからアクセスされる必要があるため、常にパブリックです。
- クラス内のメソッドは、クラス内で宣言されているフィールドに対してアクションを実行するように定義されています。 インターフェースはフィールドの宣言に欠けているので、インターフェース内のメソッドは純粋に抽象的です。
- クラスは任意の数のインタフェースを実装できますが、拡張できるスーパークラスは1つだけです。 インターフェイスは任意の数のインターフェイスを拡張できますが、インターフェイスを実装することはできません。
- クラスには、変数を初期化するためにコンストラクタが定義されています。 ただし、初期化するフィールドがないため、インターフェイスにコンストラクタはありません。 インターフェイスのフィールドは、宣言時にのみ初期化されます。
結論:
クラスとインタフェースはどちらも独自の重要性を持っています。 タスクがどのように行われるかを定義する必要があるときにクラスが使用されます。 どのタスクを実行する必要があるのかを知る必要があるときには、インターフェースが使用されます。