Java Review(十三、オブジェクト向け---抽象クラス)

3264 ワード

@
目次
  • 抽象メソッドと抽象クラス
  • 抽象クラスの役割
  • 下から上へクラスの継承階層を上へ移動すると、上位レベルにあるクラスは汎用性が高く、抽象的になる可能性があります.ある観点から、祖先クラスはより一般的であり、他のクラスを派生させるベースクラスとしてのみ使用したい特定のインスタンスクラスとして使用されません.
    抽象メソッドと抽象クラス
    抽象メソッドと抽象クラスはabstract修飾子を使用して定義しなければならない.抽象メソッドのあるクラスは抽象クラスとして定義するしかなく、抽象クラスには抽象メソッドがなくてもよい.
    抽象メソッドと抽象クラスのルールは以下のとおりです.
  • 抽象クラスはabstract修飾子を使用して修飾しなければならない.抽象メソッドもabstract修飾子を使用して修飾しなければならない.抽象メソッドにはメソッド体がない.
  • 抽象クラスはインスタンス化できず、newキーワードを使用して抽象クラスのコンストラクタを呼び出して抽象クラスのインスタンスを作成することはできません.抽象クラスに抽象メソッドが含まれていなくても、この抽象クラスはインスタンスを作成できません.
  • 抽象クラスは、メンバー変数、メソッド(通常のメソッドおよび抽象メソッドの両方)、コンストラクタ、初期化ブロック、内部クラス(インタフェース、列挙)の5つの成分を含むことができる.抽象クラスのコンストラクタは、インスタンスの作成には使用できません.主にサブクラスによって呼び出されます.
  • 抽象メソッドを含むクラス(抽象メソッドを直接定義することを含む;または抽象親クラスを継承したが、親クラスに含まれる抽象メソッドを完全に実現していない;またはインタフェースを実現したが、インタフェースに含まれる抽象メソッドを完全に実現していない3つの場合を含む)は抽象クラスとして定義できる.

  • 抽象クラスインスタンス
    public class Main {
        public static void main(String[] args) {
            Person p = new Student();
            p.run();
        }
    }
    
    //   Person
    abstract class Person {
        //   
        public abstract void run();
    }
    
    //     
    class Student extends Person {
        //               
        @Override
        public void run() {
            System.out.println("Student.run");
        }
    }
    

    抽象クラスの役割
    抽象クラスはインスタンスを作成できず、親としてのみ継承できます.
    意味の観点から、抽象クラスは複数の具体的なクラスから抽象化された親クラスであり、より高いレベルの抽象を持っている.同じ特徴を持つ複数のクラスから1つの抽象クラスを抽象化し,この抽象クラスをそのサブクラスのテンプレートとし,サブクラス設計の随意性を回避した.抽象クラスはテンプレートモデルの設計を体現し、抽象クラスは複数のサブクラスの汎用テンプレートとして、サブクラスは抽象クラスの基礎の上で拡張、改造を行うが、サブクラスは全体的に抽象クラスの行為方式をほぼ保留する.抽象的な親を記述する場合、親は複数のサブクラスの汎用メソッドを提供し、1つ以上のメソッドをそのサブクラス実装に残します.これはテンプレートモードであり、テンプレートモードも非常に一般的で簡単な設計モードの1つです.次に、テンプレートモードの例を示します.この例の抽象親では、親の一般的な方法は抽象的な方法に依存し、抽象的な方法はサブクラスに遅延して実装されます.
    テンプレート・モードの例-抽象親
    public abstract class SpeedMeter{
       //   
       private double turnRate;
      public SpeedMeter() {}
      //                  
       public abstract double calGirth() ;
       
       public void setTurnRate(double turnRate){
         this.turnRate = turnRate ;
       }
          
      //           
      public double getSpeed(){
        //       *  
        return calGirth () * turnRate;
      }
    
    }  
    

    テンプレートパターンの例-サブクラス
    public class CarSpeedMeter extends SpeedMeter{
       private double radius;
       public CarSpeedMeter(double radius){
         this.radius = radius ;
       }   
       //        
       public double calGirth(){
        return radius * 2 * Math.PI ;
       }
        
       public static void main(String[] args){
         //    CarSpeedMeter     ,               
        CarSpeedMeter csm = new CarSpeedMeter(O.34) ;
        csm.setTurnRate(15) ;
        System.out.println(csm . getSpeed()) ;
       }
    
    } 
    
    SpeedMeterクラスには速度テーブルの汎用アルゴリズムが提供されているが、いくつかの具体的な実装の詳細は、そのサブクラスCarSpeedMeterクラスに延期されている.これも典型的なテンプレートモードです.テンプレートモードはオブジェクト向けのソフトウェアでよく用いられ,その原理は簡単で,実現も簡単である.テンプレートモードを使用する簡単なルールを次に示します.
  • 抽象親クラスは、使用する必要があるいくつかのメソッドのみを定義し、実現できない部分を抽象メソッドに抽象化し、その子クラスに残して実装することができる.
  • 親クラスには、他の一連のメソッドを呼び出す必要があるメソッドが含まれる場合があります.これらの変調メソッドは、親クラスによっても、その子クラスによっても実装できます.親クラスで提供されるメソッドは、汎用メソッドを定義しているだけで、その実装は完全に自己実装ではなく、子クラスの支援に依存しなければならない可能性があります.

  • 抽象的な思想を使用した後:呼び出し者は抽象的な方法の定義に関心を持つだけで、心の子類の具体的な実現にかかわる必要はありません.
    参考:【1】:『クレイジーJava講義』【2】:『Javaコアテクノロジー巻一』【3】:https://www.liaoxuefeng.com/wiki/1252599548343744/1260456371027744