Javaマルチステート基礎学習

14191 ワード

マルチステートベースの学習
マルチステートの基礎構文:
    1.    (         )
         -----> 
    2.    (         )
         -----> 
      :
        Java       ,       
                     ,             
    3.     :
                    
                   
            :       
            :            
    4.        ?
                         ,        

Animalクラスの作成
public class Animal {
    public void move(){
        System.out.println("     ");
    }
}

Birdクラスの作成
public class Bird extends Animal{
    public void move(){
        System.out.println("     ");
    }
    public void eatWorm(){
        System.out.println("     ");
    }
}

Catクラスの作成
public class Cat extends Animal{
    public void move(){
        System.out.println("     ");
    }
    public void catchMouse(){
        System.out.println("     ");
    }
}

テストクラスTest 01の作成
public class Test01 {
    public static void main(String[] args){
        Animal a1=new Animal();
        a1.move();
        Cat c1=new Cat();
        c1.move();
        Bird b1=new Bird();
        b1.move();
        System.out.println();

        //                
        //    
        Animal a2=new Cat();
        //  a2 move()  
        a2.move();//  “     ”

        Animal a3=new Cat();
        Cat x=(Cat)a3;
        x.catchMouse();//“     ”
        Animal a4=new Bird();
        if(a4 instanceof Cat){//      
            Cat y=(Cat)a4;
            y.catchMouse();//“     ”
        }else if(a4 instanceof Bird){//      
            Bird y=(Bird)a4;
            y.eatWorm();//“    ”
        }
    }
}

プログラム出力結果:
     
     
     

     
     
     

分析a 2.move();
JAvaコンパイルフェーズ:コンパイラにとって、コンパイラはa 2のタイプがAnimalであることしか知らないので、コンパイラは文法をチェックするときにAnimalに行きます.classバイトコードファイルでmove()メソッドを探しました.見つかりました.move()メソッドをバインドします.コンパイルに合格しました.静的バインドに成功しました.(コンパイルフェーズは静的バインドに属する)実行フェーズ:実行フェーズの場合、実際にはスタックメモリに作成されたjavaオブジェクトがCatオブジェクトであるため、moveの場合、本当にmoveに参加するオブジェクトは猫であるため、実行フェーズはCatオブジェクトのmove()メソッドを動的に実行する.このプロシージャは実行バインドフェーズに属します.(実行フェーズバインドはダイナミックバインドに属する)マルチステートは複数の形態を表す:コンパイル時は1つの形態で実行時は別の形態である
分析:
Animal a3=new Cat(); 注意:コンパイルされたコードのみが実行されます.
質問:a 3.catchMouse();これでいいですか.いけません.コンパイラはa 3のタイプがAnimalであることしか知らないので、Animalに行きます.classではcatch Mouseメソッドが見つからないので:a 3.catchMouse();このようにコンパイルするとエラーが発生します
これでダウンシフトが必要になります(強制タイプ変換)
Cat x=(Cat)a3;
x.catchMouse();//“     ”

        ?
Animal a4=new Bird();//   a4   Animal,           
Cat y=(Cat)a4;    //    ,    Bird     Cat
          //      java.lang.ClassCastException    
y.catchMouse();

どうやってjavaを避けるの?lang.ClassCastExceptionのような間違い?
演算子の使用:instanceof 1:instanceof実行フェーズで動的参照がオブジェクトを指すタイプを判断できます2:構文:(instanceofタイプを参照)3:instanceof演算子の結果は、true/false 4:仮定(c instanceof Cat)のみです.trueで表す:c参照が指すスタックメモリのjavaオブジェクトはCat仮定(c instanceof Cat)falseで表す:c参照が指すスタックメモリのjavaオブジェクトはCatではないいつでも、タイプを下に変換するときはinstanceof演算子を使用して判断しなければならない(java仕様要件)
Animal a4=new Bird();
        if(a4 instanceof Cat){//      
            Cat y=(Cat)a4;
            y.catchMouse();//“     ”
        }else if(a4 instanceof Bird){//      
            Bird y=(Bird)a4;
            y.eatWorm();//“    ”
        }