Java抽象クラスとインターフェースの個人的な理解と応用

違い:
(1)抽象クラスを継承する必要があり、単一の継承のみ。インターフェイスを実装する必要があり、複数の実装が可能です。
(2)抽象メソッドは抽象クラスで定義でき、非抽象メソッドも定義できます。サブクラスは抽象クラスを継承した後、非抽象メソッドを直接使用できます。インターフェイスは抽象メソッドのみを定義できます。これはサブクラスで実装する必要があります。 。
(3)抽象クラスの継承は、システムの基本的な共通コンテンツを定義することです。インターフェースの実現は、システムの追加機能を定義することです。

1.抽象クラス

抽象メソッドを使用する必要があります概要キーワードの変更。クラスに抽象メソッドが含まれている場合、それは抽象クラスと呼ばれ、抽象クラスはクラスの前にabstractキーワードで変更する必要があります。抽象クラスには具体的な実現メソッドがないため、抽象クラスを使用してオブジェクトを作成することはできません。

抽象クラスについては、次の点に注意してください。
•抽象メソッドを非抽象クラスに含めることはできません。抽象親クラスのサブクラスがすべての抽象メソッドを実装できない場合は、サブクラスも抽象として定義する必要があります。言い換えると、抽象クラスが拡張する非抽象サブクラスでは、すべての抽象メソッドを実装する必要があります。また、抽象メソッドは非静的であることに注意してください。
•抽象クラスは、new演算子を使用して初期化できません。ただし、サブクラスの構築メソッドで呼び出される構築メソッドを定義することは可能です。たとえば、CeometricObjectクラスの構築メソッドは、CircleクラスとRecfangeクラスで呼び出されます。
抽象メソッドを含むクラスは抽象でなければなりません。ただし、抽象メソッドを含まない抽象クラスを定義することはできますこの場合、new演算子を使用してこのクラスのインスタンスを作成することはできません。このクラスは、新しいサブクラスの基本クラスを定義するために使用されます。
•サブカテゴリはリライト親クラスのメソッドであり、抽象として定義します。これはまれですが、親クラスのメソッド実装が子クラスで無効になった場合に役立ちます。この場合、サブクラスは抽象として定義する必要があります。
•サブクラスの親クラスが具象である場合でも、サブクラスは抽象である可能性があります。たとえば、Objectクラスは具象ですが、GeometricObjectなどのサブクラスは抽象にすることができます。
•new演算子を使用して抽象クラスからインスタンスを作成することはできませんが、抽象クラスをデータ
として使用することはできますしたがって、次のステートメントは、要素がGeometricObject型の配列を作成するのに適切
です。GeometricObject[] objects = new GeometricObject [10];
次に、GeometricObjectのインスタンスを作成し、その参照値を配列に割り当てることができます。
オブジェクト[0] = new Circle();

【注1】抽象的なキーワードと共存できないキーワードは?
private no(サブクラスをオーバーライドできません)
static no(クラス名の呼び出しにコンテンツがありません)
final no(finalメソッドを書き換えることはできません)

****個人的な理解:**抽象クラスは、クラスのテンプレートである形式クラスと同等であり、内部の抽象メソッドは、使用時にインスタンス化する必要があるいくつかの形式メソッドです。合格できる正式なパラメータと実際のパラメータ記憶に似ていますが、違いがあります。

public class Demo {
    
    

	public static void main(String[] args) {
    
    
	
	//非抽象类的子类来创建实例对象	
	door D=new door();
	D.open();
	D.close();
		
	//不可以直接用new创建实例,下列写法是错误的
	BigDoor d=new BigDoor();
	
	
	//抽象类作为数据类型定义数组
	BigDoor[] d=new BigDoor[10];
	d[0]=new door();
	d[0].open();
	d[0].close();

	}

}
abstract class BigDoor{
    
    
	public abstract void open();
	public abstract void close();
}
class door extends BigDoor{
    
    
	public void open() {
    
    
		System.out.println("open");
	}
	public void close() {
    
    
		System.out.println("close");
	}
}

2.インターフェース

抽象クラスのすべてのメソッドが抽象メソッドである場合、インターフェイスである別の形式で抽象クラスを定義して表現できます。

インターフェイスには、変数とメソッドを含めることができます。ただし、インターフェイスの変数は暗黙的にpublic static final変数として指定され(privateで変更されたpublic static final変数のみがコンパイルエラーを報告します)、メソッドは暗黙的にpublic abstractmethodsとして指定されることに注意してください。パブリック抽象メソッド(private、protected、static、finalなどの他のキーワードによる変更はコンパイルエラーを報告します)、およびインターフェイス内のすべてのメソッド具体的に実現できない、つまり、インターフェイスのメソッドそれらはすべて抽象的なメソッドでなければなりません。

ここから、インターフェイスと抽象クラスの違いを漠然と見ることができます。インターフェイスは非常に抽象型であり、抽象クラスよりも「抽象的」であり、通常、インターフェイスには変数が定義されていません。
注意点:
1。
(1)クラス間には継承関係があり、クラスとインターフェースの間には実装関係があります。
(2)インターフェースをインスタンス化できません。インターフェイスを実装し、インターフェイス内のすべての抽象メソッドを書き換えるサブクラスの後でのみ、サブクラスをインスタンス化できます。それ以外の場合、このサブクラスは抽象クラスです。
2.インターフェースの使い方は?----実現、implementsキーワードを使用します
(1)Javaクラスは多重継承をサポートしていませんが、クラスは複数のインターフェースを実装できます。
(2)クラスは、別のクラスを継承しながら、複数のインターフェースを実装できます。
説明:
サブクラスがインターフェイスのメソッドを実装する場合、メソッド公開に変更、インターフェイスが定義されている場合、明示的に書き出されていなくても、メソッドはデフォルトでパブリックであるためです。

****個人的な理解:**インターフェースは特定のメソッドです。必要なメソッドを実装する必要がある場合は、インターフェースを介して実装できます。インターフェイスを介して達成することができます多重継承

abstract class Big{
    
    
	public abstract void open();
	public abstract void close();
}

interface action{
    
    
	public void opendoor();
	public void closedoor();
}


class door extends Big{
    
    
	public void open() {
    
    
		System.out.println("open");
	}
	public void close() {
    
    
		System.out.println("close");
	}
}


class good implements action{
    
    
	public void opendoor() {
    
    
		System.out.println("Open doors");
	}
	public void closedoor() {
    
    
		System.out.println("Close doors");
	}
}


class D extends door implements action{
    
    
	public void closedoor() {
    
    
		System.out.println("close door");
	}
	public void opendoor() {
    
    
		System.out.println("open door");
	}
}
public class Demo {
    
    

	public static void main(String[] args) {
    
    
		door d=new door();
		d.close();
		
		//实现接口
		good g=new good();
		g.closedoor();
		g.opendoor();
		
		//抽象类+接口
		D ans=new D();
		ans.close();
		ans.open();
		ans.closedoor();
		ans.opendoor();
	}
	
}

おすすめ

転載: blog.csdn.net/qq_40924271/article/details/110437026