Javaマルチステート基礎学習
14191 ワード
マルチステートベースの学習
マルチステートの基礎構文:
Animalクラスの作成
Birdクラスの作成
Catクラスの作成
テストクラスTest 01の作成
プログラム出力結果:
分析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();このようにコンパイルするとエラーが発生します
これでダウンシフトが必要になります(強制タイプ変換)
どうやって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仕様要件)
マルチステートの基礎構文:
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();//“ ”
}