抽象クラス
定義:
いわゆる抽象クラスは、通常のクラスの構造における抽象メソッドコンポーネントの追加を指します。抽象メソッドは、メソッド本体のないメソッドを指し、抽象メソッドも、abstractキーワードを使用して定義する必要があります。抽象メソッドを持つクラスは抽象クラスに属している必要があり、抽象クラスは抽象宣言を使用する必要があります。
抽象メソッドと通常のメソッドについて:
1.すべての通常メソッドには、メソッド本体を表す "{}"があり、メソッド本体を持つメソッドは、オブジェクトから直接呼び出す必要があります;
2.抽象クラスの抽象メソッドにはメソッド本体がありません、宣言に「{}」を追加する必要はありませんが、抽象宣言が必要です。そうでない場合、コンパイル中に構文エラーが発生します。
例:抽象クラスを定義する
abstract class A{
public void fun(){
System.out.println("存在方法体的方法");
}
//此方法并没有方法体的声明,并且存在abstract关键字,表示抽象方法
public abstract void print();
}
注:抽象クラスはオブジェクトを直接インスタンス化できません。
抽象クラスの使用の原則:
1.抽象クラスにはサブクラスが必要です。つまり、各抽象クラスはサブクラスによって継承される必要がありますが、Javaでは各サブクラスは1つの抽象クラスしか継承できないため、単一の継承制限があります
。2。抽象クラスのサブクラス(サブクラスは抽象クラスではない)は、抽象クラス内のすべての抽象メソッドをオーバーライドする必要があります(必須のサブクラスオーバーライド)
。3 。オブジェクトの上方変換の概念に依存し、抽象クラスはサブクラスによって完了できます。オブジェクト操作をインスタンス化します。
例:抽象クラスの適切な使用
abstract class A7{ //定义一个抽象类
public void fun(){ //普通方法
System.out.println("存在方法体的方法");
}
//抽象方法
public abstract void print();
}
//一个子类只能继承一个抽象类,属于单继承局限
class B7 extends A7{
public void print(){ //抽象类的子类,而且是一个普通类
System.out.println("666"); //强制要求覆写的方法
}
}
public class Test1_1_4_1 {
public static void main(String args[]){
A7 a=new B7(); //向上转型
a.print(); //被子类覆写过的方法
a.fun();
}
}
//结果
//666
//存在方法体的方法
抽象クラスの制限
1.抽象クラスにはいくつかの属性があるため、抽象クラスには構築メソッドが必要であり、その目的は属性を初期化することであり、親クラスが最初に実行され、次にサブクラスが呼び出されると、サブクラスオブジェクトは引き続き満たされます。
2.抽象クラスはサブクラスを持つ必要があり、最終定義クラスはサブクラスを持つことができないため、抽象クラスは最終定義を使用できません。3。
抽象クラスは抽象メソッドを持つことができませんが、抽象クラスである限り、キーワードを直接使用することはできません新しいインスタンス化されたオブジェクト;
4.抽象クラスは引き続き内部抽象クラスを定義でき、サブクラスは必要に応じて内部クラスを定義して抽象内部クラスを継承するかどうかを選択することもできます。
例:抽象クラス内の内部クラスの定義
abstract class A8{ //定义一个抽象类
abstract class B8{ //定义内部抽象类
public abstract void print();
}
}
class X extends A8{ //继承static内部抽象类
public void print(){
System.out.println("666");
}
class Y extends B8{ //定义内部抽象类的子类,此类不是必须覆写
public void print(){ //方法覆写
}
}
}
5.外部抽象クラスは静的宣言を使用できませんが、外部抽象クラスは静的宣言を使用できます。静的宣言を使用する内部抽象クラスは、継承時に「外部クラス。内部クラス」の形式で表される外部抽象クラスと同等ですクラス名。
例:staticによって定義された内部抽象クラスは外部抽象クラスです
abstract class A8{ //定义一个抽象类
static abstract class B8{ //static定义的内部类属于外部类
public abstract void print();
}
}
class X extends A8.B8{
public void print(){ //继承static内部抽象类
System.out.println("666");
}
}
public class Test1_1_4_2 {
public static void main(String args[]){
A8.B8 ab=new X(); //向上转型
ab.print();
}
}
//结果
//666
6.抽象クラスでは、静的プロパティまたはメソッドが定義されていれば、オブジェクトがないときに直接呼び出すことができます。
例:抽象クラスで静的メソッドを定義する
abstract class A8{ //定义一个抽象类
public static void print(){ //static方法
System.out.println("666");
}
}
public class Test1_1_4_2 {
public static void main(String args[]){
A8.print(); //直接调用static方法
}
}
//结果
//666
抽象的なアプリケーションテンプレートのデザインパターン
例:抽象クラスの通常のメソッドで抽象メソッドを呼び出す
abstract class A8{ //定义一个抽象类
public void fun(){ //此为普通方法
this.print(); //在普通方法中直接调用抽象方法
}
public abstract void print(); //此为抽象方法
}
class X extends A8{ //抽象类必须有子类
public void print(){
System.out.println("666");
}
}
public class Test1_1_4_2 {
public static void main(String args[]){
A8 a=new X(); //通过子类实例化抽象化对象
a.fun(); //抽象类中的普通方法
}
}