JAvaの多形性


多形性とは?


多形性(Polymorphics)とは「多様な形態を持つ能力」を意味し、Javaでは1つのタイプの参照変数が多様なタイプのオブジェクトを参照することができ、多形性を実現する.

かくせんたく


上casting:子の参照変数を親の参照変数としてタイプ鋳造(省略可能)
下り鋳造:親参照変数を子参照変数に鋳造する(省略不可)
ジャワを学ぶ過程で、鏡と下鏡を混同することが多い.時には舞台から降りられないこともあるし、時にはまたできる.
これは、親インスタンスを子インスタンス参照オブジェクトに割り当てることはできませんが、子インスタンスをエスカレーションしてから降格する違いは理解できません.
public class Tv {
    public boolean power;
    public int channel;

    public Tv(int channel){
        this.power = false;
        this.channel = channel;
    }

    public void printName(){
        System.out.println("Tv");
    };
}

public class CaptionTv extends Tv{
    public String text = "Caption";

    public CaptionTv(int channel){
        super(channel);
    }
    public void printName(){
        System.out.println("Caption!");
    }
}

public class AppleTv extends Tv{
    public String text = "Apple";

    public AppleTv(int channel){
        super(channel);
    }
    public void printName(){
        System.out.println("Apple!");
    }
}
public Tv t1 = new Tv(10);
public CaptionTv t2 = new CaptionTv(12);
// public CaptionTv t3 = new Tv();  컴파일 에러

public void casting(){
    Tv temp1 = t2;   // 업캐스팅 생략 가능
    CaptionTv temp2 = (CaptionTv) t2;   // 다운 캐스팅 생략 불가
    System.out.println("type casting : " + temp2.text);
    //CaptionTv temp3 = (CaptionTv) t1;   // 컴파일 에러. 부모 인스턴스는 다운캐스팅 불가
}

多形の例


では、なぜ代替オブジェクトのタイプを選ぶのでしょうか.
REFACTARINGの授業を受けているときに教授に耳を傾けてもらうということが多くなります彼はこれが不要と冗長なコードを減らす最も有効な方法だと言った.
  • 親オブジェクトは何らかの方法のパラメータとして同じであるが、他の子オブジェクトが入ると
  • 親は同じですが、他の子供の配列やリストを含める必要がある場合は
  • が必要です.
    1つ目の場合は、パラメータを親に報告してから、下線で使用し直すことができます.
    // 여전히 지저분하다
    public void polymorphism(Tv t){
        if(t instanseof AppleTv){
        	(AppleTv)t.printName();
        }
        else if(t instanseof CaptionTv){
        	(CaptionTv)t.printName();
        }
    }
    このようにコードを実現することができる.多形性を利用して実現されるが,コードは乱雑で重複性が多い.コードを簡単にするにはどうすればいいですか?抽象的な方法や方法の重ね合わせです.
    TvクラスでprintNameメソッドが定義されている場合、または抽象メソッドとして宣言されている場合は、ドロップダウンせずに親参照変数として子メソッドに直接アクセスできます.
    public void polymorphism(Tv t){
        t.printName()
    }
    インスタンスメソッド参照変数のタイプを考慮せずに、インスタンスのメソッドを上書きします.
    2番コードは以下の通りです.
    Tv[] arr = new Tv[2];
    arr[0] = new CaptionTv(10);
    arr[1] = new AppleTv(11);
    
    for(Tv item: arr){
        item.printName();
    }

    抽象化


    棄権キー抽象クラスとメソッドを使用できます.
    抽象クラス:抽象メソッドを持つクラスにインスタンス化できません.親もインスタンス化したい場合は、抽象メソッドではなくメソッドを使用して抽象化する必要があります.
    ≪抽象メソッド|抽象メソッド|oraolap≫:親のみに宣言子を作成するメソッドを子クラスに強制して作成し、宣言子の本文を定義します.

    インタフェース


    インタフェースは抽象クラスであり,抽象度が高く,体幹を持つ一般的な方法を持つことができない.
    インタフェース規則
  • すべてのメンバー変数はpublic static finalでなければなりません.これは省略できます.
  • すべての方法は共通の要約でなければなりません.これは省略できます.
  • 抽象的なツールであるため、publicキーワードとabstractキーワードは強制的ですが、すべての変数とメソッドに適用されるので省略できます.ただし、本明細書のdefaultメソッドとstaticメソッドを有する場合は、これにタグを付ける必要があります.
    public interface InterfaceName {
        public static final memberVariable;
        public abstract void method1();
        void method2();	// public, abstract 생략 가능
        static void method3() { ... }    // public만 생략 가능
        defualt void method3() { ... }    // public만 생략 가능
    }

    インタフェースを使用したマルチフォーム化


    インタフェースによって実装されるクラスは、インタフェース参照変数によって参照できます.インタフェース参照変数は、インタフェースによって実装されるメンバー変数とメソッドのみ使用できます.
    public interface Fightable { ... }
    public class Fighter { ... }
    
    public Fightable = new Fighter();
     또는
    public Fightable = (Fightable)new Fighter();
    インタフェースを実装する場合は、@Override宣言を使用することが望ましい.
    多形性は,メソッドパラメータとしてのインタフェース参照変数やメソッドの戻りタイプをインタフェースとして指定することで実現できる.
    クラスと同様に、角を選択する必要があります.
  • インタフェース参照変数からクラス参照変数として鋳造する場合、
  • を省略することはできない.
  • クラスインスタンスをインタフェース参照変数に割り当てる場合は
  • を省略することができる.
    Reference
    ジャワの晶石、南宮城沢