Javaインタフェースと抽象クラス間の類似点と相違点について話します
抽象クラスとインターフェイスをこれら二つの概念のが私の意見、インターフェースや抽象クラスでは、長い間、本当に非常によく似た私を悩ま。多くは明るいアイデアの偉大な神を参照してください、唯一の文法上の2つの違いを理解することは簡単なことができ、データの間を探しています。弾丸をかむと波の小さな要約を作ります。おそらく、それがさらに深い、オリバーになります理解し、知識を習得した後!
文法の違い
このクラスは、抽象クラスの最大値を継承することができるが、複数のインターフェイスを継承することができます。
- インターフェイスのデフォルトの変数宣言があり、最終的な、しかし、抽象クラスは、非final変数を含めることができます。
- インターフェイスのメンバーは、すべてでなければならないのパブリック、およびクラスのメンバーは、すなわち、官民および保護された抽象いつものスタイルの一般的なクラスのメンバーは、変更することができるかもしれません。
インタフェースアプリケーションは、キーワード
implements
、キーワードを使用する必要があり、抽象クラスを実装するためextends
の拡張を。あなたは、一般的なクラスが実装インタフェースをしたい場合は、それがされ、すべてのインターフェイスのメソッドを実装する必要がありますが、状況が抽象的で派生クラスを変更できます抽象クラスを継承した、ように直接抽象メソッドに抽象クラスを実装することではありません。
インタフェースは、インタフェースを継承できる抽象クラスは他のクラス以上のインターフェイスを継承することができ、そしてインターフェースは、インターフェースに実装される方法を提供することなく、抽象クラスで実装されてもよいです。
抽象クラスは、コンストラクタを持つことができますが、それだけを呼び出すためのサブクラスのコンストラクタのために、インスタンスを作成するために使用することはできません。および工法インターフェースを許可していませんがあります。
深い理解
- JDK1.8前に、暗黙のインタフェースすべての抽象メソッドは、具体的に実施される方法、および一般的な方法があることができ、抽象クラス、JDK1.8後、インタフェースがされ、デフォルトのメソッドまたは静的メソッドを宣言することができ達成するための具体的な方法を提供します。
抽象クラスインターフェースと比較して、その中で明確な利点を有し、界面のデフォルトメソッドの前に現れる:良好前方互換性(前方互換性)、すなわち、クラスに損傷を与えることなく、既存のコードの場合に継続します新機能を追加します。しかし、デフォルトの方法の出現は、インタフェースにもこの効果を達成できるようにということ。:1は、上に述べた上でJavaのデフォルトと静的メソッド
- 抽象クラスは、「オブジェクト」に直面している、それが「オブジェクト」で提供する必要がある基本的な機能や動作の基本的な性質を持っている必要があり、年齢属性を持つ人々の仕事だろうと同じように、など。同じ基本的な機能のオブジェクト、学生、教師、警察の叔父から同じ抽象クラスの継承をお楽しみください......彼らは老人持っているだけでなく、動作しますが、それは我々が異なるライブやっ年齢、何も同じではないかもしれないということです。これは実際に、あること、「-aがある」という概念である「学生のクラスはヒトです。」
abstract class People{
private int age;
public abstract void doSomething();
}
- そして、インターフェースは「機能」のためである機能を持つオブジェクトを定義する必要があり、何があっ主題、私はちょうど私があなたが誰であるか気にしない、あなたがライン上で何ができるかを知る必要があります。機械や学生が整っているかどうか、学習機能と同じように、彼らは自分のタイプに関係なく、あなたができるこのインタフェースを実装することができます。そして、オブジェクトの機能やスキルは確かにたくさんある、そして、マルチインタフェースを実現するためには、非常に合理的です。「ある-」との関係とは異なり、インターフェースは、「オブジェクトが学ぶためのスキルを持っている」という意味「は、」概念である表し。
interface studyable {
void howToStudy();
default void info() {
System.out.println("study is important for everyone..");
}
}
- インターフェイスと抽象クラスは、操作の種類が、大幅に拡張性を増加するとき、オブジェクトが決定される、マルチステート、マルチステート結合上方遷移および動的使用の明らかな利点を実現することができます。
public static void main(String[] args) {
studyable[] studyables = new studyable[]{new Robot(), new Student()};
for (studyable s : studyables) {
s.howToStudy();
s.info();
}
System.out.println("*************************************");
People[] peoples = new People[]{new Student(), new Teacher()};
for (People p : peoples) {
p.doSomething();
}
}
//测试结果
Robot comes out
Student comes out!
robot need to practice
study is important for everyone..
student will read book..
study is important for everyone..
*************************************
Student comes out!
Teacher comes out!
student should study..
teacher should teach..