Javaにおける抽象クラスとインターフェースの主な違いは、抽象クラスが抽象化を実装するために使用されるのに対し、インターフェースは抽象化と多重継承を実装するために使用されることです。
オブジェクト指向プログラミング(OOP)の大きな柱の1つが抽象化です。
これは、実装の詳細を隠蔽し、機能のみをユーザーに表示することである。
例えば、リモコンを操作するのに、ユーザーは内部の回路を理解する必要はない。
抽象化もそれと同じです。
プログラマーは、そのオブジェクトがどのように行われるかではなく、何を行うかに焦点を当てることができるのです。
Javaでは、抽象化を実現する方法として、抽象クラスを用いる方法と、インターフェースを用いる方法があります。
さらに、継承もOOPの柱の一つです。
すでに存在するクラスのデータやメソッドを利用することを指す。
多重継承は、複数のクラスのデータやメソッドを利用することである。
インターフェースを使って多重継承を実現することができる。
Javaにおける抽象クラスとは
abstractキーワードで宣言されたクラスは、abstractクラスと呼ばれます。
抽象クラスは、抽象メソッドだけでなく、非抽象メソッドも持つことができます。
クラスは抽象クラスを拡張し、抽象クラスの抽象メソッドを実装することができます。
抽象クラスからオブジェクトを生成することはできませんが、抽象クラスを継承したクラスからオブジェクトを生成することは可能です。
以下の例を参照してください。
図1: Shape抽象クラス
図2: Rectangleクラス
図3: プログラム1のメインクラス
Shapeは抽象クラスです。
抽象メソッド draw と非抽象メソッド display を持ちます。
Rectangle クラスは Shape を継承しています。
したがって、Rectangle クラスは、抽象メソッド draw を実装しています。
main関数では、Rectangleオブジェクトが生成されます。
obj.draw()でRectangle draw()のメソッドを呼び出し、”Rectangle “と表示されます。
Javaにおけるインターフェースとは
Javaにおけるインターフェースは、クラスと似ています。
インターフェイスに含まれるメソッドはすべて抽象的なメソッドです。
抽象クラスと同様に、インターフェイスはインスタンス化することができません。
インターフェイスは、抽象化だけでなく、多重継承の実装にも使用することができます。
インターフェースは、interface キーワードで宣言します。
インターフェイスを実装するクラスは、インターフェイスで宣言されたすべてのメソッドを実装する必要があります。
以下の例では、インターフェイスを利用して抽象化を実現しています。
図4: Shape インターフェース
図5: 円クラス
図6: プログラム 2 のメインクラス
Shapeはインターフェースであり、drawという抽象メソッドを持つ。
CircleクラスはShapeを継承しています。
したがって、Circleクラスは抽象メソッドdrawを実装している。
main関数では、Circleオブジェクトが生成されます。
s.draw()でCircleのdrawメソッドが呼び出され、「Circle」と表示されます。
インターフェイスは多重継承を実現するためにも利用することができます。
図7:インターフェースA
図8: インタフェース B
図9: クラスC
図10: プログラム 3 のメインクラス
インタフェースA,Bはともに抽象メソッドdisplayを持ちます。
クラス C はインタフェース A と B の両方を実装し、メソッド display の実装を提供します。
mainメソッドでは、Cのオブジェクトが生成されます。
obj.displayはCのdisplayメソッドを呼び出し、”Hello World!”と表示します。
Javaにおける抽象クラスとインターフェイスの違い
定義
抽象クラスとは、抽象キーワードで宣言されたクラスで、抽象メソッドと非抽象メソッドの集合体です。
これに対し、Javaにおけるインターフェースは、抽象メソッドの集合体であるクラスと同様の参照型です。
これがJavaにおける抽象クラスとインタフェースの基本的な違いです。
変数
Javaにおける抽象クラスとインターフェースの違いの1つは、使用する変数です。
抽象クラスがfinal, non-final, static, non-staticの変数を持つことができるのに対し、インターフェースはstaticとfinalの変数しか持つことができません。
メソッド
Javaにおける抽象クラスとインターフェースのもう一つの違いは、抽象クラスが抽象メソッドと非抽象メソッドを持つことができるのに対して、インターフェースは抽象メソッドしか持つことができない点です。
多重継承
また、抽象クラスは多重継承を行うことができません。
また、抽象クラスは多重継承を行うことができませんが、インターフェイスは多重継承を行うことができます。
したがって、Javaにおける抽象クラスとインタフェースの違いとして、適用可能性を挙げることができます。
クラスのキーワード
また、abstractキーワードは抽象クラスを宣言するときに使いますが、interfaceキーワードはインターフェイスを宣言するときに使います。
拡張と実装
また、抽象クラスはキーワード “extends “を使って拡張することができます。
インターフェイスクラスは、キーワード “implements “で実装することができます。
実装
さらに、抽象クラスは “imprines “というキーワードで実装できますが、interfaceは抽象化および多重継承の実装に使用されます。
結論
Javaにおける抽象クラスとインターフェースの違いは、抽象クラスが抽象化を実装するために使用されるのに対し、インターフェースは抽象化および多重継承を実装するために使用されることです。