JAvaにおけるマルチステートのまとめ


ブログ原文------>https://www.yanzhaochang.top/read/6
Javaマルチステートまとめ
1定義
異なるクラスのオブジェクトが同じメッセージに応答することを許可することを意味します.すなわち、同じメッセージは、送信オブジェクトによって異なる動作方式を採用することができる.(メッセージの送信は関数呼び出しです)
多態、簡単に言えば、同じ行為が複数の異なる表現形式や形態を持つ能力である.
例えば、水が1杯あって、それが温かいのか、氷なのか、熱いのか分かりませんが、触ると分かります.私がコップを触るという動作は、温度の異なる水に対して、異なる結果を得ることができます.これが多態です.
2ダイナミックリンク
親クラスのメソッドの1つが、親クラスで定義され、子クラスで書き換えられていない場合にのみ、親クラスタイプの参照によって呼び出されます.
親クラスで定義されたメソッドについて、子クラスで書き換えが行われた場合、親クラスタイプの参照は子クラスのメソッドを呼び出します.これがダイナミックリンクです.
3実現に必要な条件
継承、書き換え、向上
≪継承|Inherit|emdw≫:継承関係のある子と親がマルチステートに存在する必要があります.
書き換え:子クラスは親クラスのメソッドの一部を再定義し、これらのメソッドを呼び出すと子クラスのメソッドが呼び出されます.
アップシフト:親クラスの参照が子クラスのオブジェクトを指す
転換:
アップシフト:サブクラス特有の機能へのアクセスを制限するためにAnimal a=new Cat();
親タイプのすべてのメンバーを呼び出すことができ、子タイプの固有のメンバーを呼び出すことはできません.最終的な実行効果はサブクラスの具体的な実現を見ます!
ダウンシフト:サブクラス特有の機能を使用するためにAnimal a=new Cat()Cat c=(Cat)a;強制変換;
1:親の参照のみを強く変換でき、親のオブジェクトを強く変換できません
2:親の参照が現在のターゲットのオブジェクトを指す必要があります.
3:サブクラスタイプのすべてのメンバーを呼び出すことができます.
4:属性が書き換えられていない
4マルチステートのメリット
1代替性:マルチステートは既存のコードに代替性を有する.グラフィッククラスは、円クラスに対応し、円環などの他の任意の円形ジオメトリに対しても同様に動作します.
2拡張性:マルチステートはコードに拡張性を追加します.新しいサブクラスを追加すると、既存のクラスの多態性、継承性、およびその他の特性の実行に影響しません.
3インタフェース性:マルチステートはメソッド署名を通じてサブクラスに共通のインタフェースを提供し、サブクラスによって彼女を改善またはカバーすることによって実現される.
4メンテナンス性:後期コードのメンテナンスに有利である.
5多態の弊害
1サブクラス固有の機能は使用できません
2サブクラス呼び出しの作成
6マルチステートコンパイル実行の概要
1メンバー変数:コンパイル左、実行左
2コンストラクションメソッド:サブクラスオブジェクトを作成するときに、親のコンストラクションメソッドにアクセスし、親のデータを初期化します.
3メンバーメソッド:コンパイルは左、実行は右(メソッド書き換えの意味)
4静的メソッド:コンパイルは左を見て、実行は右を見ます.静的にクラスに関連しているため、書き換えとは言えないので、アクセスの左側にあります.
7まとめ
1親タイプの参照を使用して子クラスのオブジェクトを指す
2この参照は、親クラスで定義されたメソッドと変数のみを呼び出すことができます.
3サブクラスに親クラスのメソッドが書き換えられている場合、このメソッドを呼び出すと、サブクラスのこのメソッド(ダイナミックリンク、ダイナミック呼び出し)が呼び出されます.
4変数は書き換えられず,書き換えの概念はメソッドにのみ適用され,子クラスに親クラスの変数が書き換えられるとコンパイル時にエラーが報告される.
例:
    abstract class Animal {
	abstract void say();
    }

    class Dog extends Animal {
	void say() {
		System.out.println("   !");
	}

	void lookHome() {
		System.out.println("  ");
	}
    }

    class Cat extends Animal {
	void say() {
		System.out.println("   ");
	}

	void catchMouse() {
		System.out.println("   ");
	}
    }

    class DTDemo {
	public static void main(String[] args) {
		Animal a = new Cat(); 
                /*       ,          。            
		                 。
		      :    。      。            。*/

		// a.catchMouse(); //     :      。

		/*               。
		               。*/
		// Cat c = (Cat)a;//                    。
		// c.say();
		// c.catchMouse();

		//   :    ,                  ,       。
		// Animal a1 = new Dog();
		// Cat c1 = (Cat)a1;//     : ClassCastException
	}
    }