Javaのアップシフトとダウンシフト

1697 ワード

転換するには、まず継承が必要だ.継承はオブジェクト言語におけるコード多重化のメカニズムであり、簡単に言えば、サブクラスは親クラスの非プライベート属性とメソッドを継承し、サブクラスは自分の属性とメソッドを拡張し続けることができる.
アップシフト:サブクラスオブジェクトが親に移行し、簡単な理解は親タイプのサブクラスオブジェクトであり、Father f=new Son()と同様である.(Fatherは親またはインタフェース、Sonは子)
下への移行:親オブジェクトを子に変換します.簡単な理解では、親タイプのオブジェクトを子タイプに変換します.これに似ています.Son s=(Son)f;
しかし、ここでは、アップシフトは安全ですが、ダウンシフトは安全ではありません.例えば、親が参照するオブジェクトは親であり、アップシフトの子ではありません.この場合、ダウンシフトは安全ではありません.実行時にjavaに報告されます.lang.ClassCastExceptionエラー.彼はinstanceofを使用して、このようなエラーを回避することができます.つまり、下に転換できるかどうかです.(だからここからも、上へ転換してから下へ転換できることがわかります)
最初は直接Son s=new Son();もっと便利じゃないですか.次の例を見てみましょう.

public class Human {
    public void sleep() {
        System.out.println("Human sleep..");
    }
    public static  void doSleep(Human h){
           h.sleep();
          
    }//            ,             ,      。

    public static void main(String[] args) {
        Human h = new Male();//     
        doSleep(new Male());//        ,                    (  :doSleep(h);,    
                      //     Human h1 = new Female();   doSleep(h1);           ),       
                    //    ,          ,        ,           。
        doSleep(new Female());
        
    }
}

class Male extends Human {
    @Override
    public void sleep() {
        System.out.println("Male sleep..");
    }
}

class Female extends Human {
    @Override
    public void sleep() {
        System.out.println("Female sleep..");
    }

}

もう一つ注意したいのは、アップグレードを使用する場合、親参照は、子クラスのメソッド(書き換えたものを除く)を失います.つまり、子クラスのメソッドを参照するとメソッドが見つかりません.次に、新しいものです.「動的バインド」これは、親参照親メソッドを呼び出すときに子が親メソッドを書き換える場合、親の元のメソッド(Overrideを上書きするメソッド)ではなく、この参照に基づいて子メソッドを書き換えるメソッドです.この呼び出しプロシージャは動的バインドと呼ばれます.