意味と抽象クラスとインタフェースの違いを共有するためにJavaインタビュー-------
定義を初めて目:
接口
行動の抽象、抽象メソッドの集合であり、APIは、分離の目的のインタフェース定義と実装を使用して達成することができます。インターフェイスは、インスタンス化することはできません。最終のpublic staticの意味暗示されている任意のフェルドのいずれかの非constメンバが含まれていない。同時に、それはどちらかの抽象メソッド、静的メソッドである達成するために何の非静的な方法はありません。
抽象类
クラスは、キーワード抽象クラスによって変更され、インスタンス化されていない、その主な目的は、コードの再利用です。インスタンス化、およびJavaクラスの一般的な形態とあまり異ならないことに加えて、抽象メソッドではないが、一つ以上の抽象メソッドが存在してもよいです。方法または共通のメンバ変数を実装し、その後、継承方法を介してオブジェクトコードの再利用に到達関連するJavaクラスを抽出するための最も一般的な抽象クラス。
具体的には、インターフェースの動作が抽象的である、あなたは抽象的で何ができる、抽象クラスは、あなたがやっていることです。
例えばArrayList
、源は、このです。
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
その中で、彼は抽象クラスと4つのインタフェースを継承します。
抽象クラスは、どのようにそれを書くには?見てみましょうArrayList
継承された抽象クラスをAbstractList
:
public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E> {
protected AbstractList() {
}
public boolean add(E e) {
add(size(), e);
return true;
}
abstract public E get(int index);
...
}
我々は簡単に、抽象クラスを達成するための具体的な方法を持っているなど抽象的な機能を、見つけることができます
私たちは見てみましょうArrayLis
トン継承されたインタフェースList:
public interface List<E> extends Collection<E> {
int size();
boolean isEmpty();
boolean contains(Object o);
Iterator<E> iterator();
Object[] toArray();
<T> T[] toArray(T[] a);
default void sort(Comparator<? super E> c) {
Object[] a = this.toArray();
Arrays.sort(a, (Comparator) c);
ListIterator<E> i = this.listIterator();
for (Object e : a) {
i.next();
i.set((E) e);
}
}
図から分かるように、本方法は、次いで、(後で追加デフォルトの方式java8除く)関数本体はなく、すべてのインターフェイスは、ソースコードのArrayListを見て:
public boolean add(E e) {
...
}
public E get(int index) {
...
}
public int size() {
...
}
public <T> T[] toArray(T[] a) {
...
}
それは、簡単に確認することができArrayList
、その後の実現は何それを達成することはない抽象クラスやメソッドのインターフェースの連続を達成するためには?以下の定義があります。
- 一般的なカテゴリ(非Interface)は、抽象クラスは、すべての抽象メソッドは、必ずしもそうではないが、その非抽象メソッドのオーバーライドを実装する必要があります継承します。
- 一つのインタフェースは抽象クラスを継承する場合は、抽象メソッドのすべてを継承しません。
- 抽象クラスが別の抽象クラスを継承して、彼らは抽象メソッドのすべてを継承しません。
- 通常のクラスがインタフェースを継承すると、その抽象メソッドのすべてを書き直さなければなりません。
- ときに一つのインタフェースは、その抽象メソッドのすべてを継承しなくても、別のインタフェースを継承します。
- 抽象クラスがインタフェースを継承すると、その抽象メソッドのすべてを継承する必要はありません。
要約すると、我々は次のような違いを提示します
類似性:
(1)インスタンス化されていない
(2)インタフェースクラスまたはメソッドのみインターフェイスまたはインスタンス化する抽象クラス有する抽象クラスが実装のサブクラス。
異なる点:
(1)のみでなく、方法を実現するために、Java(登録商標)1.8はデフォルトメソッド本体を定義することができ、及び抽象クラス定義および実装が存在し得る、方法は、抽象クラスで実装することができるインタフェースを定義します。
インターフェース実装を実現するためのキーワード(2)、継承された抽象クラスキーワードが延びています。クラスは複数のインターフェイスを実装することができるが、このクラスは、抽象クラスを継承することができます。だから、インタフェースを使用することで、間接的に多重継承を達成することができます。
(3)は、特定の機能を強調するためのインタフェース、および抽象クラスは、所属を強調します。
public static final、必須初期値に(4)インタフェースメンバ変数のデフォルト値は、変更することができない、すべてのメンバーの方法は、公共の抽象的です。抽象クラスのメンバ変数のデフォルトのデフォルトは、サブクラスで再定義することができ、また再割り当てすることができます。抽象抽象メソッドが変更され、花ではない、セミコロンで終了する必要があり、同期され、ネイティブおよびその他の変更、プライベート静的することはできませんブラケット。
(5)インタフェースは、将来の保守を容易にするために、削除、追加、頻繁に使用する機能に使用される、抽象クラスは、より後のコードに適用されない、公共の一種として機能するように変化する傾斜反対再れます。何の蓄積が必要とされていない場合、蓄積機能は、インターフェイスで必要とされる抽象クラスです。
クラス対抽象クラス対インタフェース
- 多重継承をサポートしています:インタフェースのサポートを、抽象クラスがサポートされていません。クラスがサポートされていません。
- 抽象機能をサポートしています:セマンティックインタフェースをサポートし、抽象クラスをサポートしています。クラスがサポートしていません。
- これは、関数が実装することができます:インターフェースが許可されていません。抽象クラスのサポート、クラスができます。
- 許可の例は:インターフェイスが許可されていない、抽象クラスが許可されていない;クラスが許します。
- 一部の機能が実装できます:インターフェイスが許可されていません。抽象クラスができます。クラスが許可されていません。
- コンテンツ定義:パブリックインターフェイス機能、およびパブリック静的はFNAL定数を含むことができる; NOいかなる限定と抽象クラス。
- クラスの「テンプレート」部分的な実装を提供することを意図しているとき、および抽象クラスの使用を遅らせるために必要な機能のいくつかを実装します;あなたは多重継承をサポートするために、またはタイプの用途のインタフェースを定義したい場合は、あなたが与える上で計画している場合:それを使用するとき完全な実現のクラスを使用します。