TIJ復習ノート8

3565 ワード

             ,        (encapsulation)   (inherit)          。
  • マルチステート
  • 多態の利点と欠陥
  • コンストラクタとマルチステート
  • コヒーレント戻りタイプ
  • アップシフトとダウンシフト
  • その他
  • マルチステート
    典型的なマルチステートは、B、CがAを継承し、その中のメソッドfooを上書きすることであり、あるコードにはタイプAが含まれており、BとCの参照を渡すことができ、Aでメソッド(A.foo)を呼び出し、マルチステート性のため、正しいBまたはCの対応するメソッド(foo)が見つかる.
    その中で、カバー、継承、アップグレードに関連しています.
    最も明らかなのは、コード多重化の能力を高めることです.あるところでは、タイプはAのタイプを書くだけで、直接使うことができて、D、Eを拡張してAを継承して、このコードを引き続き使うことができます.1つの関数または方法は,異なる効果,すなわち多態性を示す.
    コードを見る
    import java.util.*;
    class Shape {
        void draw(){
        }
    }
    class Circle  extends Shape {
        @Override 
        void draw(){
            System.out.println("Circle.draw()");
        }
    }
    class Triangle extends Shape {
        @Override
        void draw(){
            System.out.println("Triangle.draw()");
        }
    }
    
    public class HelloWorld {
        public static void poly(Shape s){
            s.draw();
        }   
        public static void main(String[] args){
            poly(new Triangle());
            poly(new Circle());
        }
    }

    sはShapeタイプであるが,多態性のため,いずれも対応する方法を見つけることができ,後期バインドとも呼ばれる.
    マルチステートの利点と欠陥
    メリット:
    拡張性、たとえばタイプの追加
    Class Square extends Shape {
        @Override 
        void draw(){
            System.out.println("Squre.draw()");
        }
    }
    //.....
    
            poly(new Square());
    

    polyメソッドについては変更できません.
    欠点:
    メンバー変数は、polyでshapeを使用するメンバー変数のようなマルチステートでは使用できません.マルチステートバインドは行われません.
    静的メソッドはマルチステートではありません.静的メソッドはクラスメソッドで、オブジェクトに属しません.
    コンストラクタはマルチステートではなく、コンストラクタ自体がstaticです.
    コンストラクタとマルチステート
    コンストラクタ自体はマルチステートではなく、コンストラクタ内部はマルチステートであってもよい.しかし、これは安全ではありません.コンストラクタ内部でメンバーメソッドを呼び出すのは、finalのメンバーメソッドだけです.安全です.finalのメソッドは上書きできないので、マルチステートは発生しません.
    また、コンストラクタのロード順序、親メンバー初期化、親コンストラクタ、子メンバー初期化、子コンストラクタ.
    コヒーレント戻りタイプ
    JAVA 1.5で提案されている、カバーについて.
    親クラスではType 1 foo(int i){}子クラスでType 2 foo(int i){}
    Type 2がType 1のエクスポートクラスであれば、これも上書きとなります.
    アップ・モデルチェンジとダウン・モデルチェンジ
    class A {
        void foo1(){}
    }
    class B extends A{
        void foo2(){}
        public static void main(String[] args){
            A ob = new B();//     
        //  ob.foo2();    
            ((B)ob).foo2(); //    
        }
    }

    その他
    しばらく
    END