私はJavaAPIに慣れるように努力しています。しかし、私はそれをすることができません。抽象クラスをいつ使用するのかわからない。
Javaライブラリコレクションを検討してください
Collections
List Set
3つすべてがインターフェースですが、主要なものですが、add、addAll、contains、containsAllなどの共通の関数があります。Listはそれ自体で実装し、setは別の方法で実装します(重複について説明します)。セットは重複を許可しませんリストは重複を許可します。
だから私が言おうとしているのは、スーパーエンティティを持つサブエンティティに共通の機能がないときはいつでも、インターフェースに行かなければならないということです
さらに明確にするために、Collectionを抽象クラスとして作成する場合、宣言するだけでなく、いくつかのメソッドを適切に定義する必要がありますが、リストとセットの機能が異なるため(両方に共通の定義はありません)、インターフェイスとして宣言するだけです。そして、リストとセットの両方がこれを実装する必要があるという強制ルールを作成しました。
しかし、両方が抽象クラスとしてそれを維持しているいくつかの共通の機能がある場合。
したがって、Java自体から例を取得します。ABSTRACTにされたNumberクラスを考えてみましょう。今インターフェースを使ってそれができなかった理由を見てみましょう!!!
**public abstract class Number
extends Object
methods are**
byte byteValue()
指定された数値の値をバイトとして返します。
abstract double doubleValue()
指定された数値の値をdoubleとして返します。
abstract float floatValue()
指定された数値の値をfloatとして返します。
abstract int intValue()
指定された数値の値をintとして返します。
abstract long longValue()
指定された数値の値をlongとして返します。
short shortValue()
指定された数値の値をshortとして返します。
ここで、byteValueは非抽象メソッドであり、他のメソッドXXXValueは抽象メソッドです。Yが表示されます???
byteValue()
// taken from Number class java doc api
public byte byteValue()
指定された数値の値をバイトとして返します。これには、丸めまたは切り捨てが含まれる場合があります。
And this byteValue() method is being overriden by all the other classes like Integer,Double,Float etc.
代わりに、byteValue()も抽象化できます!!! しかし、彼らはそれをしません。彼らがなぜこのようにしたのか知りたい。