Javaはゼロから16(多態)を学ぶ

23433 ワード

一、多態とは何か
多態性とは、異なる種類のオブジェクトが同じメッセージに応答することを許容することを意味する.多態性はパラメトリック多態性と多態性を含む.多態性言語は柔軟、抽象、行為共有、コード共有の優位性を持ち、アプリケーション関数の同名問題をよく解決した.
マルチステートには、リロードとオーバーライドの2つの表現があります.
まずリロード(overload)といえば、同じクラスで発生する.どの親クラスの子クラス、継承とは関係ない.
1つの関数を識別するには、関数名のほかに、関数のパラメータ(個数とタイプ)があります.つまり、1つのクラスに2つ以上の関数があり、同じ名前でパラメータが異なることができます.
彼らの間には何の関係もなく、異なる関数ですが、彼らの機能が似ている可能性があります.だから、名前をつけて、可読性を高めます.それだけです.
さらにオーバーライド(override)は、サブクラスで発生します!つまり継承が必要な場合に上書きが発生する.
私たちは1つのクラスを継承することを知っていて、父のクラスのすべての方法があって、もしあなたがどの方法が不快で、機能が変わると感じたら、その関数を子クラスの中でもう一度実現します.
このようにしてこの方法を呼び出すと、サブクラスを実行するプロセスになる.親クラスの関数が上書きされます.(もちろん、上書きするときは関数名とパラメータは親と完全に同じでなければなりません.そうしないと、あなたの方法は親の方法には何の役にも立ちません.両者は2つの関数なので、関係ありません.)
二、簡単な実現
package com.pb.demo6;



public abstract class Pet {

   private String name;  //    

   private String sex;    //    

   private int health;        //      

   

   //       

   abstract void toHospital();



public String getName() {

    return name;

}



public void setName(String name) {

    this.name = name;

}



public String getSex() {

    return sex;

}



public void setSex(String sex) {

    this.sex = sex;

}



public int getHealth() {

    return health;

}



public void setHealth(int health) {

    this.health = health;

}

   

}
package com.pb.demo6;

/*

 *    

 */

public class Dog extends Pet {



    @Override

    void toHospital() {

        //       

        System.out.println("    :  、  !");



    }



}



package com.pb.demo6;

/*

 *    

 */

public class Pig extends Pet {



    @Override

    void toHospital() {

        System.out.println("    :  、  !");



    }



}

package com.pb.demo6;

/*

 *    

 */

public class Bird extends Pet {



    @Override

    void toHospital() {

        //       

        System.out.println("    :  、  !");



    }



}
package com.pb.demo6;

/*

 *      

 */

public class Doctor {

    

    //      

    public void cure(Pet pet){ //     

        

        if(pet.getHealth()<50){ //       50

            //       

            pet.toHospital();

            //       60,  

            pet.setHealth(60);

        }

    }



}

テストクラス
package com.pb.demo6;

/*

 *    

 */

public class Test {



    public static void main(String[] args) {

        //      

        Doctor dc=new Doctor();

        //         

       Pet brid=new Bird();

       //         

       dc.cure(brid);

     //         

       Pet dog=new Dog();

     //         

       dc.cure(dog);

     //         

       Pet pig=new Pig();

     //         

       dc.cure(pig);

       

    }



}

結果:
    :  、  !

    :  、  !

    :  、  !

三、オブジェクトの多態性
オブジェクトのマルチステートは、主に次の2つのタイプに分けられます.
アップ・モデルチェンジとダウン・モデルチェンジ
3.1対象のアップシフト:
親親オブジェクト=子インスタンス
アップシフト:子オブジェクト->親オブジェクト
アップグレードの場合、プログラムは自動的に完了します.フォーマット:
次のようになります.
 //         

       Pet brid=new Bird();

//         

       Pet dog=new Dog();

 //         

       Pet pig=new Pig();

コンパイル時タイプ:Pet、実行時タイプは特定のタイプ
すなわち、コンパイル時のタイプは、その変数を宣言する際に使用されるタイプによって決定され、実行時のタイプは、実際にその変数に割り当てられたオブジェクトによって決定される
3.2オブジェクトのダウンシフト:
下へ移動:親オブジェクト->子オブジェクト
下に移動する場合は、移動するサブクラスのタイプ、フォーマットを明確に指定する必要があります.
サブクラスのサブクラスオブジェクト=(サブクラス)親インスタンス;強制型変換
 
上の例では、サブクラスには独自のメソッドがありませんが、サブクラスに独自のメソッドがあれば、医師クラスで呼び出すことはできますか?明らかにできません.親にアップコンバートした後、親を呼び出す方法しかありません.子を呼び出す方法はinstannceofにダウンコンバートする必要があります.
四、instanceofキーワード
Javaではinstanceofキーワードを使用して、オブジェクトがそのクラスのインスタンスであるかどうかを判断できます.
オブジェクトinstanceofクラス->booleanタイプを返す
package com.pb.demo6;



public abstract class Pet {

   private String name;  //    

   private String sex;    //    

   private int health;        //      

   

   //       

   abstract void toHospital();



public String getName() {

    return name;

}



public void setName(String name) {

    this.name = name;

}



public String getSex() {

    return sex;

}



public void setSex(String sex) {

    this.sex = sex;

}



public int getHealth() {

    return health;

}



public void setHealth(int health) {

    this.health = health;

}

   

}
package com.pb.demo6;

/*

 *    

 */

public class Bird extends Pet {



    @Override

    void toHospital() {

        //       

        System.out.println("    :  、  !");



    }

    public void fly(){

        System.out.println("    !");

    }



}
package com.pb.demo6;

/*

 *    

 */

public class Dog extends Pet {



    @Override

    void toHospital() {

        //       

        System.out.println("    :  、  !");



    }

    public void run(){

        System.out.println("      !");

    }

    

}
package com.pb.demo6;

/*

 *    

 */

public class Pig extends Pet {



    @Override

    void toHospital() {

        System.out.println("    :  、  !");



    }

  public void sleep(){

      System.out.println("     !");

  }

}
package com.pb.demo6;

/*

 *      

 */

public class Doctor {

    

    //      

    public void cure(Pet pet){ //     

        

        if(pet.getHealth()<50){ //       50

            //       

            pet.toHospital();

            //       60,  

            pet.setHealth(60);

            //       

            if(pet instanceof Dog){

                //

                Dog dog=(Dog)pet;

                //         

                dog.run();

            }else if(pet instanceof Bird){

                //

                Bird bird=(Bird)pet;

                //         

                bird.fly();

            }else if(pet instanceof Pig){

                //

                Pig pig=(Pig)pet;

                //         

                pig.sleep();

            }

        }

    }



}
package com.pb.demo6;

/*

 *    

 */

public class Test {



    public static void main(String[] args) {

        //      

        Doctor dc=new Doctor();

        //         

       Pet brid=new Bird();

       //         

       dc.cure(brid);

     //         

       Pet dog=new Dog();

     //         

       dc.cure(dog);

     //         

       Pet pig=new Pig();

     //         

       dc.cure(pig);

       

    }



}

結果:
    :  、  !

    !

    :  、  !

      !

    :  、  !

     !

五、親を形参とする
package com.pb.demo2;

/*

 *    

 */

public class Goods {

    //        

    public void printPrice(){

        System.out.println("      ");

    }

}



package com.pb.demo2;

/*

 *    

 */

public class Foods extends Goods {



    @Override

    public void printPrice() {

        System.out.println("          !");

    }



    

}

package com.pb.demo2;

/*

 *    

 */

public class TVs extends Goods {



    @Override

    public void printPrice() {

    System.out.println("         !");

    }



    

}

テストクラス:
package com.pb.demo2;



public class Test {



    public static void main(String[] args) {

        //  3      

        Goods good=new Goods();

        Foods food=new Foods();

        TVs tvs=new TVs();

        //    

        showPrice(good);

        showPrice(food);

        showPrice(tvs);



    }

    //        

  static void showPrice(Goods good){

      good.printPrice();

  }

}

結果:
!