(13)Java学習ノート——対象向け07——マルチステート

4838 ワード

マルチステート
ある物事が、異なる時点で表現される異なる状態.
例:
--|猫は猫のタイプです.猫m=new猫();
--|同時に猫は動物のタイプでも、猫を動物と呼ぶこともできます.動物d=new猫();
猫のようなものは猫の形をしていて、動物の形をしています.
class   	//  
{
}

class   extends   	//  
{
}

class   extends   
{
}

  x = new  ;

   x = new  ;	//       ,      

マルチステートの前提:
1/マルチステートは継承関係を持つ
2/書き直さなければならない(書き直さなければ意味がない)
3/親参照が子オブジェクトを指す必要があります.(親f=new子();)
例:
class Fu
{
	public void show()
	{
		System.out.println("show Fu");
	}
}

class Zi extends Fu	//  ①:zi     
{
	public void show()	//  ②:       
	{
		System.out.println("show Zi");
	}
}

class DuoTaiDemo 
{
	public static void main(String[] args) 
	{
		Fu f = new Zi();	//  ③:          
	}
}

マルチステートのメンバー・アクセスの特徴:
1/メンバー変数
コンパイルは左を見て、実行は左を見てください.(変数の親)
2/構築方法
サブクラスオブジェクトを作成するときは、親の構築方法にアクセスし、親のデータを初期化します.
3/メンバーメソッド
コンパイルは左を見て、実行は右を見ます.(メソッド書き換えのため、親メソッドはクラスに覆われ、子メソッドのみが残される)
4/静的メソッド
コンパイルは左を見て、実行は左を見てください.(静的メソッドは書き換え、静的、クラス関連とは言えないので、アクセスは左側です)
メンバーメソッドに書き換えメソッドがあるため、実行は右側を見ます.
マルチステートのメリット:
1/コードの保守性の向上(継承保証)
2/コードの拡張性が向上し、前期定義のコードは後期の内容を使用することができる.(マルチステートで保証)
例:
/*
             

*/

class Animal	//    Animal  
{
	public void eat()
	{
		System.out.println("eat");
	}

	public void sleep()
	{
		System.out.println("sleep");
	}
}

class Cat extends Animal	//    cat   Anamal 
{
	public void eat()	//      
	{
		System.out.println("    ");
	}

	public void sleep()	//      
	{
		System.out.println("      ");
	}
}

class Dog extends Animal	//    Dog   Anamal 
{
	public void eat()	//      
	{
		System.out.println("     ");
	}

	public void sleep()	//      
	{
		System.out.println("      ");
	}
}
/*
          ,    Animal   ,      

*/

class AnimalTool	//    Animal   ,      
{
	private AnimalTool()	//            
	{
	}

	public static void useAnimal(Animal a)	//      Animal Animal     
	{
		a.eat();
		a.sleep();
	}
}

class DuoTaiDemo_02 
{
	public static void main(String[] args) 
	{
		Animal c1 = new Cat();	//           ,  cat  
		Animal c2 = new Cat();
		Animal c3 = new Cat();

		AnimalTool.useAnimal(c1);	// (  .   )  ,       
		AnimalTool.useAnimal(c2);
		AnimalTool.useAnimal(c3);

		System.out.println("---------------------------------");

		Animal d1 = new Dog();
		Animal d2 = new Dog();
		Animal d3 = new Dog();

		AnimalTool.useAnimal(d1);
		AnimalTool.useAnimal(d2);
		AnimalTool.useAnimal(d3);
	}
}

多態の弊害(限界):
サブクラス固有の機能は使用できません.
サブクラス固有の機能が必要な場合に使用できる方法:
a/サブクラスオブジェクトを作成し、サブクラスメソッドを呼び出します.(ただし、実際にはFuf=new Zi()という2つのオブジェクトが作成されています.    Zi z = new Zi();)
b/親の参照を強制的に子の参照に変換する.(Zi z = (Zi) f;)
オブジェクト間の移行:
アップシフト:Fuf=new Zi();
**アップグレードの役割は、オブジェクト固有の機能へのアクセスを制限することです.
ダウンシフト:Zi z=(Zi)f;
**サブクラス固有のメソッドを使用するために、ダウンコンバートを行います.
例:
class  DuoTime02
{
	public static void main(String[] args) 
	{
		Animal a = new Cat();	//      。Cat     Animal  。        ,    Cat     。              。
								//    。
		a.eat();
								//        Cat     。            。
		Cat c = (Cat)a;			//                    。
		c.eat();
		c.catchMouse();
	}

	public static void method(Animal a)	//Animal a      Animal     ,           	(Animal a = new Dog();   Animal a = new Cat();)
	{
		a.eat();
	}
	
}

abstract class Animal	//        
{
	abstract void eat();	//           
}

class Dog extends Animal	//      ,     
{
	void eat()
	{
		System.out.println("   ");	//         
	}

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

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

練習01:南北の人の飲食の実例
/*
      
*/

class Person
{
	private void Person()
	{
	}
	public void eat()
	{
		System.out.println("eat");
	}
		
}

class SouthPerson extends Person
{
	void SouthPerson()
	{
	}

	public void eat()
	{
		System.out.println("      ");
	}

	public void sell()
	{
		System.out.println("     ");
	}

}

class NorthPerson extends Person	//      ,  Perfon
{
	void NorthPerson()
	{
	}

	public void eat()
	{
		System.out.println("      ");
	}

	public void work()	//         
	{
		System.out.println("     ");
	}
}


class DuoTaiTest_01 
{
	public static void main(String[] args) 
	{
		Person p1 = new SouthPerson();	//  ,      
		p1.eat();
		SouthPerson p11 = (SouthPerson)p1;	//    ,        
		p11.sell();

		System.out.println("---------------");

		Person p2 = new NorthPerson();
		p2.eat();
		NorthPerson p22 = (NorthPerson)p2;
		p22.work();
	}
}

タイプ判定キーワードintanceof(通常、ダウンコンバート前にコードの堅牢性の判定に使用される)
instanceofは判断対象の具体的なタイプに用いられ,医用データ型判断にのみ用いられる.
例:if(a instanceof Cat)