Java プログラムは、抽象クラスを使用して、本質的に抽象的な概念を実装します。抽象クラスの機能は、多くの関連するクラスをまとめて共通のクラス、つまり抽象クラスを提供することです。また、抽象クラスによって編成された特定のクラスは、そのサブクラスとしてそこから派生します。抽象クラスはパブリックの動作を特徴付け、それを継承メカニズムを通じてその派生クラスに転送します。抽象クラスで定義されたメソッドは抽象メソッドと呼ばれます。これらのメソッドはメソッド ヘッダーの宣言のみを持ち、セミコロンを使用してメソッド本体の定義を置き換えます。つまり、特定の操作を行わずにメンバー メソッドのインターフェイス形式のみが定義されます。 。派生クラスによる抽象メンバー メソッドの再定義のみが、派生クラスに関連する操作を実際に実装します。
各サブクラスは、親クラスの抽象メソッドを継承した後、異なるステートメントとメソッド本体でそれを再定義し、同じ名前、同じ戻り値、同じパラメータ リストを持つ複数のサブクラスを形成します。目的は同じですが、特定の点でいくつかの違いがあります。実装。抽象クラスで抽象メソッドを定義する目的は、インターフェイスを実装することです。つまり、すべてのサブクラスが同じ名前のメソッドを外部に提示します。抽象クラスは、そのすべてのサブクラスのパブリック属性のコレクションと、1 つ以上の抽象メソッドを含むクラスです。抽象クラスを使用する利点の 1 つは、これらのパブリック プロパティを最大限に活用して、プログラムの開発と保守の効率を向上できることです。抽象クラスと抽象メソッドの制限は次のとおりです。
(1) abstract 修飾子で変更されたクラスを抽象クラスと呼びます。 abstract 修飾子で変更されたメンバー メソッドは、抽象メソッドと呼ばれます。
(2) 抽象クラスには、0 個以上の抽象メソッドを含めることができます。また、非抽象メソッドを含めることもできます。
(3) 抽象クラスには抽象メソッドは必要ありませんが、抽象メソッドを持つクラスは抽象クラスでなければなりません。
(4) 抽象メソッドの場合は、実装コードを記述せずに、抽象クラスにメソッド名とその型のみを指定します。
(5) 抽象クラスはサブクラスを派生でき、抽象クラスで定義されたすべての抽象メソッドは、抽象クラスから派生したサブクラスに実装する必要があります。
(6) 抽象クラスはオブジェクトを作成できません。オブジェクトを作成する作業は、抽象クラスから派生したサブクラスによって実装されます。
(7) 親クラスに同名の抽象メソッドが存在する場合、サブクラスに同名の抽象メソッドは存在できません。
(8) abstract は、final と並行して同じクラスを変更することはできません。
(9) abstract を使用して、private、static、final、またはネイティブと並行して同じメソッドを変更することはできません。
Java 言語では、クラスに抽象メソッドがある場合、そのクラスを抽象クラスとして宣言する必要があると規定しています。
サブクラスが親クラスを継承するとき、親クラスに抽象メソッドがあり、サブクラスが親クラスのすべての抽象メソッドを実装できると考える場合、サブクラスは親クラスのすべての抽象メソッドを実装する必要があります。として:
/** * サブクラス Dog は、抽象クラス Animal を継承し、抽象メソッドenjoy * @author gacl * */class Dog extends Animal { /** * Dog クラスは独自の属性を追加します*/ public String furColor; ( String n, String c) { super(n);//親クラスのコンストラクターを呼び出します Animal this.furColor = c; } @Override public void fun() { System.out.println("犬が吠えます。 .." ); }}
サブクラスが親クラスの抽象メソッドを実装できないと判断した場合は、次のようにサブクラスを抽象クラスとして宣言します。
/** * ここでのサブクラス Cat は、抽象クラス Animal を継承しており、当然、Animal クラスで宣言された抽象メソッドenjoy() を継承しています。 * ただし、サブクラス Cat は、このenjoy() メソッドを実装するのは適切ではないと考えています。それ自体は抽象クラスとして宣言されます。 * 次に、この抽象enjoyメソッドを実装する人、およびサブクラスを継承する人が、この抽象メソッドenjoy()を実装します。 * @author gacl * */abstract class Cat extends Animal { /** * Cat は独自の属性を追加します*/ public String eyeColor; public Cat(String n, String c) { super(n);//親クラスを呼び出します動物の構築方法 this.eyeColor = c;
ここでのサブクラス Cat は、抽象クラス Animal を継承しており、Animal クラス内で宣言されている抽象メソッドenjoy() を当然継承していますが、サブクラス Cat はこのenjoy() メソッドを単独で実装するのは適切ではないと考え、このメソッドを実装しています。それ自体を抽象クラスとして宣言し、次に抽象メソッドenjoyメソッドを実装する人、そしてサブクラスを継承する人が抽象メソッドenjoy()を実装します。のように:
/** * サブクラス BlueCat は抽象クラス Cat を継承し、親クラス Cat から継承した抽象メソッドenjoy を実装します * @author gacl * */class BlueCat extends Cat { public BlueCat(String n, String c) { super(n , c); } /** * 抽象メソッドenjoyを実装します */ @Override public void fun() { System.out.println("青い猫が鳴く...");
完全なテスト コードは次のとおりです。
package javastudy.summary;/** * 親クラス Animal * クラスの前に abstract を追加します。つまり、次のように宣言します: abstract class Animal * このようにして、Animal クラスは抽象クラスになります */abstract class Animal { public String name; public Animal(String name) { this.name = name; } /** * 抽象メソッド * メソッドの定義のみがあり、実装はありません。 */ public abstract void fun(); }/** * ここでのサブクラス Cat は、抽象クラス Animal から継承しており、当然、Animal クラスで宣言された抽象メソッドenjoy() を継承しています。このenjoy()メソッドも不適切であるため、自身を抽象クラスとして宣言します。 *次に、この抽象enjoyメソッドを実装する人、およびサブクラスを継承する人がこの抽象メソッドenjoy()を実装します。 * @author gacl * */abstract class Cat extends Animal { /** * Cat は独自の属性を追加します*/ public String eyeColor; public Cat(String n, String c) { super(n);//親クラスを呼び出しますAnimal の構築メソッド this.eyeColor = c; }}/** * サブクラス BlueCat は抽象クラス Cat を継承し、親クラス Cat から継承した抽象メソッドenjoy を実装します * @author gacl * */class BlueCat extends Cat { public BlueCat(String n, String c) { super(n, c) } /** * 抽象メソッドenjoyを実装します */ @Override public void fun() { System.out.println("青い猫が鳴く。 .."); } }/** * サブクラス Dog は、抽象クラス Animal を継承し、抽象メソッドenjoy を実装します * @author gacl * */class Dog extends Animal { /** * Dog クラスは独自の固有の属性を追加します * /パブリック文字列furColor; public Dog(String n, String c) { super(n);//親クラス Animal のコンストラクターを呼び出します this.furColor = c; } @Override public void fun() { System.out.println("Dog吠える ...."); }} public class TestAbstract { /** * @param args */ public static void main(String[] args) { /** * Cat クラスを抽象クラスとして宣言した後は、Cat クラスをインスタンス化できません。 * 抽象クラスは不完全で手足が欠落しているため、抽象クラスをインスタンス化できません。 */ //Cat c = new Cat("Catname","blue"); Dog d = new Dog("dogname","black"); //実装したお楽しみメソッド BlueCat を呼び出します。 = new BlueCat("BlueCatname","blue"); c.enjoy();//実装したenjoyメソッドを呼び出します}}