Javaの中で、abstractとinterfaceの違いは何ですか?
Javaにおけるabstractとinterfaceは両方とも多態性を実現するメカニズムだが、重要な違いがいくつか存在する。
- 抽象クラスは特殊なクラスであり、通常のメソッドと抽象メソッドを含むことができる。また、構築関数を持つこともできます。一方、インタフェースは純粋な抽象データ型であり、抽象メソッドと定数のみを含むことができ、構築関数を持つことはできません。
- 継承関係:1つのクラスは1つの抽象クラスを継承できますが、複数のインターフェースを実装できます。
- 方法: 子クラスは、abstractクラスを継承する際には、抽象メソッドを実装しなければならず、そうでない場合は、子クラスもabstractクラスとして宣言しなければなりません。一方、interfaceを実装する場合、子クラスはすべての抽象メソッドを実装しなければなりません。
- アクセス修飾子:abstractクラス内のメソッドには異なるアクセス修飾子を指定できますが、インターフェース内のメソッドはデフォルトでpublicであり変更できません。
- abstractクラスにはインスタンス変数と静的変数が存在するが、interfaceには定数しか持つことができない。
- 目的:abstractクラスを使用することは、コードの共有と汎用的なメソッドの実装を提供するためであり、interfaceを使用することは、規格を定義し、クラスが複数の振る舞いを実装できるようにするためである。
一般的に言えば、abstractクラスはクラスの階層構造で共有の振る舞いを定義するのに適していますが、interfaceは複数のクラスの共通の振る舞いを定義するのに適しています。