JAvaマルチステートの知識点のまとめ


以前はオブジェクト向けの多態を学習していましたが,現在は関連する知識点をまとめています.
マルチステート:
【体現】
親の参照またはインタフェースの参照は、自分のサブクラスオブジェクトを指します.
【メリット】
プログラムの拡張性の向上
【弊害】
子オブジェクトを親から参照して操作する場合は、親に既存のメソッドのみが使用され、子固有のメソッドは操作できません.
【前提】
1、関係がある必要があります:継承、実現、
2,通常は書き換え操作があります.
マルチステートテクノロジーの引き出しはプログラムの拡張性の問題を解決し、そのサブクラスの特有の方法はどのように呼び出されますか?
Animal a = new Dog(); //Animal    ,newDog()    。
ただし、親タイプ参照が子クラスオブジェクトを指す場合、子クラスオブジェクトはタイプアップ(アップシフト)されます.
アップグレードのメリット:拡張性が向上し、サブタイプが非表示になります.弊害:サブタイプ特有の方法は使用できません.サブクラス固有のメソッドを使用する場合は、サブタイプのみが使用できます.下に転換し、強制的に転換することができます.
Animal a = new Dog();
a.eat();
Dog d = (Dog)a;// a   Dog  ,    。
d.lookHome();
サブタイプ固有のコンテンツを使用する必要がある場合は、ダウンシフトを使用します.注意:アップまたはダウンにかかわらず、最終的にはサブクラスオブジェクトがタイプを変更しています.
【ダウンシフトへの注意事項】
次のようになります.
Animal a = new Dog();
//Cat c = (Cat)a;                 ,      ClassCastException  
ですので、この問題を避けるためには、下への転換前に、タイプの判断をし、タイプを判断するためのキーワード:instanceof
if(a instanceof Cat) //a        Cat  {
       // a  Cat  
        Cat c = (Cat)a;
        c.catchMouse();
        }
        else if(a instanceof Dog){
        Dog d = (Dog)a;
        d.lookHome();
                                }

【転換総括】
1、いつアップグレードしますか?
プログラムの拡張性を向上させ、サブタイプ(サブタイプが隠されている)に関心を持たず、サブクラス特有の方法を使用する必要はありません.
2、いつダウンシフトを使用しますか?
サブタイプ特有のメソッドを使用する必要がある場合は、必ずinstanceofでタイプの判断を行い、ClassCastExceptionが発生しないようにしてください
犬と猫が拡張性を向上させる方法を説明します.
//  Dog
class Dog extends Animal 
{
	public void eat()
	{
		System.out.println("  ");
	}
	public void lookHome()
	{
		System.out.println("  ");
	}
}

//   
class Cat extends Animal 
{
	public void eat()
	{
		System.out.println(" ");
	}
	public void catchMouse()
	{
		System.out.println("   ");
	}
}
//    。           Animal 。
abstract class Animal
{
	public abstract void eat();
}



class DuoTaiDemo
{
	public static void main(String[] args) 
	{
		Dog d = new Dog();
//		d.eat();
		method(d);

		Cat c = new Cat();
		method(c);
	}
	/*
	  ,      ,                ,
	           。
	          。
	          ?
	         eat,   dog,  cat,
	eat     ,  , eat    。     Animal 。

	Dog Animal    。
	Dog d = new Dog();
	Animal a = new Dog();
	Cat c = new Cat();
	Animal aa = new Cat();
	*/ 
	//    animal           dog cat    。    eat。
	//         。
	public static void method(Animal a)
	{
		a.eat();
	}

	/*
	//  Dog, dog  。
	public static void method(Dog d)
	{
		d.eat();
	}
	//  Cat, cat  。
	public static void method(Cat c)
	{
		c.eat();
	}
	*/

}