0

私は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()も抽象化できます!!! しかし、彼らはそれをしません。彼らがなぜこのようにしたのか知りたい。

4

2 に答える 2

1

byteValue()すべての Number サブクラスでオーバーライドされるわけではありません。たとえば、BigInteger、AtomicInteger、AtomicLong、BigDecimal にはありません。これらのクラスはすべて、 Number クラスのデフォルトの実装の恩恵を受けます。

于 2012-05-18T08:49:01.747 に答える
1

byteValue()インターフェイスはとのデフォルト機能を提供できませんでしたshortValue()intValue()この場合、デフォルトの動作は、これらの各メソッドを呼び出すことは、適切なキャストで呼び出すことと同じです。

また、Numberis notを考慮するとfinal、他の誰かが独自のコードベースでそれを拡張し、それらのメソッドの動作を効果的に継承している可能性があります。

(非常に) 簡単に言えば、メソッド シグネチャのみを指定したい (つまり、すべてのメソッドが であるabstract) 場合は、インターフェイスを定義できます (おそらく定義する必要があります)。

于 2012-05-18T08:52:03.460 に答える