Javaにおけるマルチステートの理解
4545 ワード
本文は主にJavaの中の多態のいくつかの特性とフォーマットを紹介して、後で1つの実例と自分の理解を添付します.
マルチステート
マルチステートとは
概念:同じ操作が異なるオブジェクトに作用し、異なる解釈があり、異なる実行結果を生成することができます.これが多態性です.(オブジェクトの多様な特性として理解できる)
多態の存在の3つの必要条件
1.継承関係の存在(実装インタフェースも継承関係)
2.書き換える方法
3.親参照が子オブジェクトを指すようにする
アップ・モデルチェンジとダウン・モデルチェンジ
1.対象のアップシフトは、実は多態書き方です.
形式:親クラス名オブジェクト名=newサブクラス名()
意味:右側にサブクラスオブジェクトが作成され、親として扱われます.
ずっと猫のオブジェクトを作成して、動物として見て、問題ありません.
注意事項:アップグレードは安全に違いない.小范囲から大范囲へ、小范囲の猫から、上へもっと広い范囲の动物に変わった.
2.オブジェクトのダウンシフトは、元に戻す動作です.
書式:サブクラス名オブジェクト名=(サブクラス名)親オブジェクト
意味:サブクラスを元に戻し、元のサブクラスオブジェクトに戻す
注意事項:
a.オブジェクトがもともと作成されたときに猫であることを保証しなければならない.
b.オブジェクトが作成されたときに猫ではなかった場合、今は猫に転向しなければならないので、エラーが発生します.
instanceofキーワード
JAvaのinstanceof演算子は、実行時にオブジェクトが特定のクラスであるかどうかを示すインスタンスです.instanceofは、このオブジェクトがこの特定のクラスまたはそのサブクラスのインスタンスであるかどうかを示すブール値を返します.
使用法:result=object instanceof classパラメータ:Result:ブールタイプ.Object:必須オプション.任意のオブジェクト式.Class:必須です.定義されたオブジェクトクラス.説明:objectがclassのインスタンスである場合、instanceof演算子はtrueを返します.objectが指定したクラスのインスタンスでない場合、またはobjectがnullの場合、falseが返されます.
ただしinstanceofはJavaのコンパイル状態と実行状態に違いがあります.
コンパイル状態では、classはobjectオブジェクトの親、自己クラス、サブクラスであってもよい.この3つの場合、Javaコンパイル時にエラーは発生しません.
実行遷移では、classはobjectオブジェクトの親であってもよく、自己クラスであってもよく、サブクラスであってもよい.前の2つの場合resultの結果はtrueであり,最後の1つはfalseであった.しかしclassがサブクラスの場合、コンパイルはエラーを報告しません.実行結果はfalseです.
インスタンスの適用
タイトル
動物類
スイミングインタフェース
犬の定義
羊の定義
カエルの定義
飼育員類
テストクラス
テスト結果
まとめ
マルチステートは、単純に親参照が子オブジェクトを指し、コードの柔軟性と拡張性を向上させることができます.
マルチステート
マルチステートとは
概念:同じ操作が異なるオブジェクトに作用し、異なる解釈があり、異なる実行結果を生成することができます.これが多態性です.(オブジェクトの多様な特性として理解できる)
多態の存在の3つの必要条件
1.継承関係の存在(実装インタフェースも継承関係)
2.書き換える方法
3.親参照が子オブジェクトを指すようにする
アップ・モデルチェンジとダウン・モデルチェンジ
1.対象のアップシフトは、実は多態書き方です.
形式:親クラス名オブジェクト名=newサブクラス名()
意味:右側にサブクラスオブジェクトが作成され、親として扱われます.
Animal animal=new Cat();
ずっと猫のオブジェクトを作成して、動物として見て、問題ありません.
注意事項:アップグレードは安全に違いない.小范囲から大范囲へ、小范囲の猫から、上へもっと広い范囲の动物に変わった.
2.オブジェクトのダウンシフトは、元に戻す動作です.
書式:サブクラス名オブジェクト名=(サブクラス名)親オブジェクト
意味:サブクラスを元に戻し、元のサブクラスオブジェクトに戻す
Cat cat =(Cat) animal;// , ,
注意事項:
a.オブジェクトがもともと作成されたときに猫であることを保証しなければならない.
b.オブジェクトが作成されたときに猫ではなかった場合、今は猫に転向しなければならないので、エラーが発生します.
instanceofキーワード
JAvaのinstanceof演算子は、実行時にオブジェクトが特定のクラスであるかどうかを示すインスタンスです.instanceofは、このオブジェクトがこの特定のクラスまたはそのサブクラスのインスタンスであるかどうかを示すブール値を返します.
使用法:result=object instanceof classパラメータ:Result:ブールタイプ.Object:必須オプション.任意のオブジェクト式.Class:必須です.定義されたオブジェクトクラス.説明:objectがclassのインスタンスである場合、instanceof演算子はtrueを返します.objectが指定したクラスのインスタンスでない場合、またはobjectがnullの場合、falseが返されます.
ただしinstanceofはJavaのコンパイル状態と実行状態に違いがあります.
コンパイル状態では、classはobjectオブジェクトの親、自己クラス、サブクラスであってもよい.この3つの場合、Javaコンパイル時にエラーは発生しません.
実行遷移では、classはobjectオブジェクトの親であってもよく、自己クラスであってもよく、サブクラスであってもよい.前の2つの場合resultの結果はtrueであり,最後の1つはfalseであった.しかしclassがサブクラスの場合、コンパイルはエラーを報告しません.実行結果はfalseです.
インスタンスの適用
タイトル
/*
,
1. :
:
:
, ( )
2. :
:
3. :
:
( ) ( )
4. :
:
( )
5. :
:
( ) ( )
6. :
:
:
7. :
, : , ,
:
1.
2. ( )
3. , ( ),
,
4. :
*/
動物類
package com.heima.demo1.Work2;
/*
1. :
:
:
, ( )
*/
public abstract class Animal {
private int age;
public void drink(){
System.out.println(" ");
}
public abstract void eat();
}
スイミングインタフェース
package com.heima.demo1.Work2;
/*
2. :
:
*/
public interface Swimming {
public abstract void swim();
}
犬の定義
package com.heima.demo1.Work2;
/*
3. :
:
( ) ( )
*/
public class Dog extends Animal implements Swimming{
// Animal , eat() , , swim()
public void eat(){
System.out.println(" ");
}
public void swim(){
System.out.println(" ");
}
}
羊の定義
package com.heima.demo1.Work2;
/*
4. :
:
( )
*/
public class Sheep extends Animal{
// , Animal , eat()
public void eat(){
System.out.println(" ");
}
}
カエルの定義
package com.heima.demo1.Work2;
/*
5. :
:
( ) ( )
*/
public class Frog extends Animal implements Swimming{
// Animal , eat() , , swim()
public void eat(){
System.out.println(" ");
}
public void swim(){
System.out.println(" ");
}
}
飼育員類
package com.heima.demo1.Work2;
/*
6. :
:
:
*/
public class Breeder {
public void breed(Animal animal){
// , Animal
// instanceof 。
if(animal instanceof Dog){
animal.drink();
animal.eat();
((Dog) animal).swim();
}
if(animal instanceof Frog){
animal.drink();
animal.eat();
((Frog) animal).swim();
}
if(animal instanceof Sheep){
animal.drink();
animal.eat();
}
}
}
テストクラス
package com.heima.demo1.Work2;
//
public class Test02 {
public static void main(String[] args) {
Breeder b=new Breeder();
// ,
b.breed(new Dog());
System.out.println();
b.breed(new Frog());
System.out.println();
b.breed(new Sheep());
}
}
テスト結果
Process finished with exit code 0
まとめ
マルチステートは、単純に親参照が子オブジェクトを指し、コードの柔軟性と拡張性を向上させることができます.