(13)Java学習ノート——対象向け07——マルチステート
4838 ワード
マルチステート
ある物事が、異なる時点で表現される異なる状態.
例:
--|猫は猫のタイプです.猫m=new猫();
--|同時に猫は動物のタイプでも、猫を動物と呼ぶこともできます.動物d=new猫();
猫のようなものは猫の形をしていて、動物の形をしています.
マルチステートの前提:
1/マルチステートは継承関係を持つ
2/書き直さなければならない(書き直さなければ意味がない)
3/親参照が子オブジェクトを指す必要があります.(親f=new子();)
例:
マルチステートのメンバー・アクセスの特徴:
1/メンバー変数
コンパイルは左を見て、実行は左を見てください.(変数の親)
2/構築方法
サブクラスオブジェクトを作成するときは、親の構築方法にアクセスし、親のデータを初期化します.
3/メンバーメソッド
コンパイルは左を見て、実行は右を見ます.(メソッド書き換えのため、親メソッドはクラスに覆われ、子メソッドのみが残される)
4/静的メソッド
コンパイルは左を見て、実行は左を見てください.(静的メソッドは書き換え、静的、クラス関連とは言えないので、アクセスは左側です)
メンバーメソッドに書き換えメソッドがあるため、実行は右側を見ます.
マルチステートのメリット:
1/コードの保守性の向上(継承保証)
2/コードの拡張性が向上し、前期定義のコードは後期の内容を使用することができる.(マルチステートで保証)
例:
多態の弊害(限界):
サブクラス固有の機能は使用できません.
サブクラス固有の機能が必要な場合に使用できる方法:
a/サブクラスオブジェクトを作成し、サブクラスメソッドを呼び出します.(ただし、実際にはFuf=new Zi()という2つのオブジェクトが作成されています. Zi z = new Zi();)
b/親の参照を強制的に子の参照に変換する.(Zi z = (Zi) f;)
オブジェクト間の移行:
アップシフト:Fuf=new Zi();
**アップグレードの役割は、オブジェクト固有の機能へのアクセスを制限することです.
ダウンシフト:Zi z=(Zi)f;
**サブクラス固有のメソッドを使用するために、ダウンコンバートを行います.
例:
練習01:南北の人の飲食の実例
タイプ判定キーワードintanceof(通常、ダウンコンバート前にコードの堅牢性の判定に使用される)
instanceofは判断対象の具体的なタイプに用いられ,医用データ型判断にのみ用いられる.
例:if(a instanceof Cat)
ある物事が、異なる時点で表現される異なる状態.
例:
--|猫は猫のタイプです.猫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)