Day 9-継承、super、this、抽象クラス

22759 ワード

第一章継承


概要


複数のクラスに同じ属性と動作がある場合、これらの内容を別のクラスに抽出すると、複数のクラスは繰り返し定義する必要がなく、このクラスを継承するだけでよい.このうち、複数のクラスを子クラス、個別のクラスを親クラス、スーパークラス、またはベースクラスと呼ぶ.
定義#テイギ#
子は親の属性と動作を継承し、子オブジェクトが親と同じ属性と同じ動作を持つようにします.サブクラスは、親の非プライベート属性とメソッドに直接アクセスできます.
メリット
  • は、コードの多重化を向上させる.
  • クラスとクラスの間に関係が生じることは,多態の前提である.

  • 継承されたフォーマット

    class   {
     ...
    }
    class   extends   {
     ... 
    }
    

    継承後の機能–メンバー変数


    メンバー変数の名前を変更しない
    この時点でアクセスに影響はありません.サブクラスは、親の非プライベートメンバー変数に直接アクセスできます.
    メンバー変数の重複名
    アクセスは影響を受け、アクセス結果はサブクラスのメンバー変数です.
    // 
    package cn.itcast.day09.demo01;
    
    public class Fu {
        int num = 8;
    }
    
    
    // 
    package cn.itcast.day09.demo01;
    
    public class Zi extends Fu {
        int num = 6;
    
        public void show(){
            System.out.println(" :"+super.num);//8
            System.out.println(" :"+this.num);//6
        }
    }
    
    
    
    package cn.itcast.day09.demo01;
    
    public class Demo01Super {
        public static void main(String[] args) {
            Zi cla = new Zi();
            cla.show();
        }
    }
    
    

    小贴士:Fuクラスのメンバー変数は非プライベートで、サブクラスから直接アクセスできます.Fuクラスのメンバー変数がプライベートになった場合、サブクラスは直接アクセスできません.通常、エンコーディングでは、パッケージの原則に従ってprivateを使用してメンバー変数を修飾しますが、親クラスのプライベートメンバー変数にどのようにアクセスしますか?そうだ!共通のgetXxxメソッドとsetXxxメソッドは、親クラスで提供できます.

    継承後の機能–メンバーメソッド


    メンバーメソッドは名前を変更しません
    子クラスの親に重複しないメンバーメソッドが表示された場合、呼び出しは影響しません.オブジェクトがメソッドを呼び出すと、まずサブクラスに対応するメソッドがあるかどうかを検索し、サブクラスに存在する場合はサブクラスのメソッドを実行し、サブクラスに存在しない場合は親クラスの対応するメソッドを実行します.
    メンバーメソッドの重複名-上書き(Override)
  • メソッド書き換え:サブクラスに親と同じメソッドが表示されると(戻り値タイプ、メソッド名、パラメータリストが同じ)、書き換えまたは複写とも呼ばれる上書き効果が表示されます.宣言は変更されず、再実装されます.

  • 書き換えの適用
    サブクラスは、必要に応じて、自分固有の動作を定義できます.親の機能名を踏襲するとともに、子の必要に応じて親メソッドを再実装し、拡張を強化します.
    package cn.itcast.day09.demo01;
    
    public class Phone {
        public void sendMessage(){
            System.out.println(" ");
        }
        public void call(){
            System.out.println(" ");
        }
        public void showNum(){
            System.out.println(" ");
        }
    }
    
    
    package cn.itcast.day09.demo01;
    
    public class NewPhone extends Phone {
        public void sendMessage(){
            super.sendMessage();
            System.out.println(" ;");
        }
    
        @Override
        public void call() {
            super.call();
            System.out.println(" ");
        }
    
        @Override
        public void showNum() {
            super.showNum();
    
            System.out.println(" ");
        }
    }
    
    
    package cn.itcast.day09.demo01;
    
    public class Demo02MethodExtend {
        public static void main(String[] args) {
            Phone one = new Phone();
            one.call();
            one.sendMessage();
            one.showNum();
            System.out.println("-------------");
    
            NewPhone two = new NewPhone();
            two.call();
            two.sendMessage();
            two.showNum();
    
        }
    }
    
    

    注意事項
  • サブクラスメソッドは、親メソッドを上書きします.パーミッションが親メソッド以上であることを保証する必要があります.
  • サブクラスメソッドは親メソッドを上書きし、戻り値タイプ、関数名、パラメータリストはそっくりです.

  • 継承後の機能–構築方法

  • コンストラクションメソッドの名前はクラス名と同じなので、子クラスは親のコンストラクションメソッドを継承できません.
  • 構築メソッドの役割は、メンバー変数を初期化することであり、サブクラスの初期化中に、サブクラスの構築メソッドのデフォルトのsuper()が親クラスの構築関数を呼び出してから、サブクラス構築関数のメソッドボディを実行する.

  • superとthis


    サブクラスオブジェクトを作成するたびに、親空間を初期化してから、サブクラスオブジェクト自体を作成します.目的は、サブクラスオブジェクトに対応する親空間が含まれている場合、その親のメンバーを含めることができます.親メンバーがprivate修飾されていない場合、サブクラスは親メンバーを自由に使用できます.コードは,サブクラスの構造メソッド呼び出しに現れる場合,必ず親クラスの構造メソッドを呼び出す.
    package cn.itcast.day09.demo01;
    
    public class Animal {
        public Animal() {
            System.out.println("Animal()");
        }
    
        public void eat() {
            System.out.println("Animal:eat()");
        }
    }
    
    
    package cn.itcast.day09.demo01;
    
    public class Cat extends Animal {
        public Cat() {
            System.out.println("Cat()");
    
        }
    
        public void eat() {
            System.out.println("Cat():eat");
        }
    
        public void methodSuperThis() {
            super.eat();
            this.eat();
        }
    }
    
    
    package cn.itcast.day09.demo01;
    
    public class Demo03SuperThis {
        public static void main(String[] args) {
            Cat one = new Cat();
            //Animal()
            //Cat()
            one.eat();//Cat:eat()
            one.methodSuperThis();
            //Animal:eat()
            //Cat:eat()
        }
    }
    
    

    継承の特徴

  • Javaは単一継承のみをサポートし、マルチ継承はサポートされていません.
  • Javaは多層継承をサポートします.
    最上位の親クラスの場合Objectクラス.すべてのクラスは親としてObjectをデフォルトで継承します.
  • 子クラスと親クラスの相対的な概念.

  • 第二章抽象類


    抽象メソッド:メソッド体のメソッドがありません.コード例:public abstract void run();抽象クラス:抽象メソッドを含むクラス.クラスに抽象メソッドが含まれている場合は、クラスを抽象クラスとして定義する必要があります.
    abstract class   { 
    	public abstract void run()}
    

    抽象的な使用


    抽象クラスを継承する子**は、**親のすべての抽象メソッドを書き換える(実装する)**必要があります.そうでなければ、サブクラスも抽象クラスとして宣言する必要があります.

    注意事項

  • 抽象クラスではオブジェクトを作成できません.
    理解:抽象クラスのオブジェクトを作成し、抽象的なメソッドを呼び出すと仮定しますが、抽象的なメソッドには具体的なメソッド体がなく、意味がありません.
  • 抽象クラスには、子クラスがオブジェクトを作成するときに親クラスメンバーを初期化するための構造方法があります.
    理解:サブクラスの構築方法には、デフォルトのsuper()があり、親クラスの構築方法にアクセスする必要があります.
  • 抽象クラスには、必ずしも抽象メソッドが含まれているとは限らないが、抽象メソッドがあるクラスは必ず抽象クラスである.
    理解:抽象メソッドが含まれていない抽象クラスは、呼び出し元にクラスオブジェクトを作成させたくないため、通常、特定のクラス構造設計に使用されます.
  • 抽象クラスのサブクラスは、抽象親クラス内のすべての抽象メソッドを書き換える必要があります.そうしないと、コンパイルは通過できず、エラーが発生します.サブクラスが抽象クラスでない限り.
    理解:すべての抽象メソッドを書き換えないと仮定すると、クラスに抽象メソッドが含まれる可能性があります.では、オブジェクトを作成した後、抽象的なメソッドを呼び出すのは意味がありません.

  • 第三章継承の総合事例


    グループの主人は普通のお年玉を出す.あるグループには複数のメンバーがいて、グループの主はメンバーに普通のお年玉を送った.普通のお年玉のルール:
  • グループマスターの金額は、グループマスター残高から差し引かれ、平均n等分され、メンバーに受け取られます.
  • メンバーがお年玉を受け取った後、メンバー残高に保存します.

  • 説明に従って、ケース内のすべてのクラスの定義と指定したクラス間の継承関係を完了し、お年玉を出す操作を完了してください.
    ケース拡張:
  • メンバーの残高が0でない場合、どのように処理しますか?
  • グループの所有者が小数点以下の金額を入力したい場合、どのように処理しますか?