Java-1.6マルチステートを最初から認識する

3265 ワード

この章では、いくつかのマルチステート、javaの3つの特性の最後の1つを簡単に議論します.
1.概念
多態(Polymorphism)は文字通り「多様な状態」という意味です.オブジェクト向け言語では、インタフェースのさまざまな実装方式がマルチステートである.Charlie Calvertsのマルチステートの説明を参照してください.マルチステートは、親オブジェクトを1つ以上の子オブジェクトと同等に設定することを可能にします.親オブジェクトは、現在割り当てられている子オブジェクトの特性に基づいて異なる方法で動作します(「Delphi 4プログラミング技術の内幕」から抜粋).
はっきり言って、親が子オブジェクトを参照します.
(1)呼び出し時に使用するタイプの複数の状態
次にインタフェースクラスPersonを導入します
package com.ray.ch01;

public abstract class Person {
	public abstract void eat();

	public abstract void sleep();

}

次のBoxerもSingerもPersonという親を継承しています.
package com.ray.ch01;

public class Boxer extend Person {

	public void fight() {

	}

	@Override
	public void eat() {
		System.out.println("boxer is eatting");
	}

	@Override
	public void sleep() {
		System.out.println("boxer is sleeping");
	}

}
package com.ray.ch01;

public class Singer extend Person {

	public void sing() {

	}

	@Override
	public void eat() {
		System.out.println("singer is eatting");
	}

	@Override
	public void sleep() {
		System.out.println("singer is sleeping");
	}

}

テストクラスTest:
package com.ray.ch01;

public class Test {
	public static void main(String[] args) {
		Person boxer = new Boxer();
		boxer.eat();
		boxer.sleep();
		Person singer = new Singer();
		singer.eat();
		singer.sleep();
	}
}

テスト出力:
boxer is eattingboxer is sleepingsinger is eattingsinger is sleeping
上のコードからboxerとsingerオブジェクトはPersonクラスであり、実際にそのバージョンのeatとsleepメソッドを呼び出す必要があることは知られていませんが、なぜ最後の結果が私たちに必要なのでしょうか.次は結論を出します.
(2)パラメータ使用タイプの多様な状態
Person、Boxer、Singerの3つのクラスを引き続き使用しますが、テストクラスTestを修正します.
package com.ray.ch01;

public class Test {
	
	private void test(Person person) {
		person.eat();
		person.sleep();
	}
	
	public static void main(String[] args) {
		Test test = new Test();
		Person boxer = new Boxer();
		test.test(boxer);
		Person singer = new Singer();
		test.test(singer);
	}
}

上のコードでは、Personをパラメータとしてtestに転送し、personがそれぞれのメソッドを呼び出します.
同様の問題は,パラメータが伝達される前にpersonがその実装バージョンを指すことを全く知らなかった.
テスト出力:
boxer is eattingboxer is sleepingsinger is eattingsinger is sleeping
(3)戻り値はマルチステートを使用する.
Person、Boxer、Singerの3つのクラスをもう一度使用し、テストクラスTestを修正します.
package com.ray.ch01;

public class Test {

	private Person test(Person person) {
		return person;
	}

	public static void main(String[] args) {
		Test test = new Test();
		Person boxer = new Boxer();
		test.test(boxer).eat();
		test.test(boxer).sleep();
		Person singer = new Singer();
		test.test(singer).eat();
		test.test(singer).sleep();
	}
}

テスト出力:
boxer is eattingboxer is sleepingsinger is eattingsinger is sleeping
プレゼンテーションのために、テストクラスのコードを回して、一つの方法でPersonクラスに戻り、それぞれの方法を呼び出しました.
では、javaはどのようにしてできますか?ここで簡単に言いますが、後の章で詳しく展開します.
実はeatもsleepも汎化された方法で、どの実際のバージョンを呼び出すかという問題に直面しています.
一般的なoop以外の言語では、メソッドが最初からバインドされているメモリアドレスである前期バインドメソッドが使用されます.
しかしjavaは後期バインド(実行時バインド)を使用し、特殊なコードを通じて実行方法のメモリアドレスを計算します.もちろん、このコードはコンパイラの中にあります.私たちは見えません.実行時に計算したメモリアドレスをバインドします.
まとめ:この章では多態について簡単に議論した.
この章はここまでです.ありがとうございます.
-----------------------------------
目次
本文はブロガーのオリジナル文章で、ブロガーの許可を得ずに転載してはならない.