抽象クラスは拡張できますが、どのクラスでも拡張できますか? では、なぜ一部の特定のクラスは抽象化され、他のクラスは抽象化されないのでしょうか?
さらに、私は理解しようとしましたが、常にかなり混乱していますが、インターフェイスと抽象クラスの実際の違いは何ですか?
私のためにこれをクリアできる人に感謝します!
抽象クラスは拡張できますが、どのクラスでも拡張できますか? では、なぜ一部の特定のクラスは抽象化され、他のクラスは抽象化されないのでしょうか?
さらに、私は理解しようとしましたが、常にかなり混乱していますが、インターフェイスと抽象クラスの実際の違いは何ですか?
私のためにこれをクリアできる人に感謝します!
インターフェイスはメソッド シグネチャのみを記述できます。
public void add(int a, int b);
そしてそれを実装するクラスは、メソッドを定義する必要があります。
抽象クラスは継承することしかできませんが、メソッドを定義することはできます:
public void add(int a, int b) {
return a+b;
}
そして、それを実装するすべてのクラスがそのメソッドを使用できます。抽象クラスもfinal
メソッドを実装できるため、それを拡張するクラスによって再実装されることはありません。
抽象クラスの有用性は、いくつかのクラスに共通する機能 (メソッドと属性の両方) を因数分解することです。また、どのクラスも拡張可能で、最終クラスは拡張できないというのは正しくありません。
インターフェースは機能的なコントラクトのみを定義するため、抽象クラスはインターフェースとは異なります。達成する必要があるものは何かを定義しますが、それを実装する方法を示すことはありません。一方、抽象クラスは、一般的な抽象的な実装の詳細を具体化できますが、具体的な側面を開いたままにしますそのサブクラスによって実装されます。ある意味で、抽象クラスはインターフェースと具象クラスの中間点のようなものです。
抽象クラスのポイントは、意味のあるデフォルトの動作です。
抽象クラスは、意味のあるメソッドに意味のある既定の実装を提供し、クライアントが実装する抽象メソッドのみを残すことができます。クライアントは、必要に応じて、これらのデフォルトの実装をオーバーライドすることを選択できます。
インターフェイスはそのような機会を提供しません。これらはすべて、クライアントによって実装する必要がある抽象メソッドです。
どちらかまたは両方の命題ではありません。多くの場合、両方が提供されます。たとえば、java.util.Map
およびを参照してください。java.util.AbstractMap