Javaの多態性の理解、利点と精典の例
4320 ワード
コア:
1、マルチステートとは、プログラムで定義された参照変数が指す具体的なタイプと、その参照変数によって発行されるメソッド呼び出しがコンパイル時に確定しないのではなく、プログラムの実行中に確定することを意味する.すなわち、参照変数がどのクラスのインスタンスオブジェクトを指し、その引用変数によって発行されるメソッド呼び出しがどのクラスで実現されるメソッドなのか、プログラム実行中に決定する必要があります.プログラム実行時に特定のクラスを特定するため、ソースプログラムコードを変更することなく、参照変数を様々な異なるクラス実装にバインドすることができ、この参照呼び出しの具体的な方法が変更される.すなわち、プログラムコードを変更することなく、プログラム実行時にバインドされた特定のコードを変更し、プログラムが複数の実行状態を選択できるようにすることができる.これが多態性です.
2、子クラスへの親参照は、アップグレードされたため、親クラスにあるメソッドと属性にのみアクセスできますが、子クラスに存在し、親クラスに存在しないメソッドでは、再ロードされても使用できません.子クラスが親クラスのメソッドの一部を書き換えた場合、そのメソッドを呼び出すときは、必ず子クラスで定義されたメソッド(動的接続、動的呼び出し)を使用します.
3、継承チェーンにおけるオブジェクトメソッドの呼び出しの優先度:this.show(O)、super.show(O)、
this.show((super)O)、super.show((super)O).つまり、thisオブジェクトの親を先に調べ、パラメータの親を再確認する必要はありません.
一、多態とは何かオブジェクト向けの3つの特性:パッケージ、継承、マルチステート マルチステートの定義:異なるクラスのオブジェクトが同じメッセージに応答することを許可することを指す.すなわち、同じメッセージは、送信オブジェクトによって異なる動作方式を採用することができる.(メッセージの送信は関数呼び出しである) マルチステートを実装する技術は、動的バインド(dynamicbinding)と呼ばれ、実行中に参照されるオブジェクトの実際のタイプを判断し、その実際のタイプに基づいて対応する方法を呼び出すことを意味する. マルチステートの役割:タイプ間の結合関係を除去します. 現実では,多態に関する例は枚挙にいとまがない.例えば、F 1キーを押すという動作は、現在Flashインタフェースの下でポップアップされているのがAS 3のヘルプドキュメントです.現在Wordの下でポップアップされているのがWordヘルプです.Windowsの下でポップアップされるのが、Windowsヘルプとサポートです.同じイベントが異なるオブジェクトで発生すると、異なる結果が得られます.
次は多態の存在の3つの必要条件で、みんなが夢を見る時すべて暗記することができることを要求します!
多態が存在する3つの必要条件1、継承しなければならない.二、書き直さなければならない.三、親参照は子オブジェクトを指します.
二、多態のメリット:
1.代替性(substitutability).マルチステートは、既存のコードに置換可能です.たとえば、マルチステートは円Circleクラスに対して動作し、円環などの他の任意の円形ジオメトリに対しても同様に動作します.2.拡張性(extensibility).マルチステートはコードに対して拡張性を有する.新しいサブクラスを追加すると、既存のクラスの多態性、継承性、およびその他の特性の実行および操作に影響しません.実際には,新しいサブクラスはマルチステート機能を容易に得ることができる.例えば、円錐、半円錐および半球の多態を実現した上で、球体類の多態性を容易に加えることができる.3.インタフェース性(interface-ability).マルチステートは、メソッド署名によって、サブクラスに共通のインタフェースを提供し、サブクラスによってそれを改善または上書きすることによって実現される.図8.3に示すように.図中のスーパークラスShapeは、2つのマルチステートを実現するインタフェース方法、computeArea()およびcomputeVolume()を規定している.CircleやSphereのようなサブクラスは,マルチステートを実現するために,この2つのインタフェースメソッドを補完または上書きする.4.柔軟性(flexibility).応用において柔軟で多様な操作を体現し、使用効率を高めた.5.簡略化(simplicity).マルチステート簡略化はアプリケーションソフトウェアのコード作成と修正プロセスを簡略化し、特に大量のオブジェクトの演算と操作を処理する際に、この特徴は特に際立って重要である.
Javaにおけるマルチステートの実装方式:インタフェース実装,親を継承してメソッド書き換え,同じクラスでメソッド再ロードを行う.
三、経典の実例.
1、マルチステートとは、プログラムで定義された参照変数が指す具体的なタイプと、その参照変数によって発行されるメソッド呼び出しがコンパイル時に確定しないのではなく、プログラムの実行中に確定することを意味する.すなわち、参照変数がどのクラスのインスタンスオブジェクトを指し、その引用変数によって発行されるメソッド呼び出しがどのクラスで実現されるメソッドなのか、プログラム実行中に決定する必要があります.プログラム実行時に特定のクラスを特定するため、ソースプログラムコードを変更することなく、参照変数を様々な異なるクラス実装にバインドすることができ、この参照呼び出しの具体的な方法が変更される.すなわち、プログラムコードを変更することなく、プログラム実行時にバインドされた特定のコードを変更し、プログラムが複数の実行状態を選択できるようにすることができる.これが多態性です.
2、子クラスへの親参照は、アップグレードされたため、親クラスにあるメソッドと属性にのみアクセスできますが、子クラスに存在し、親クラスに存在しないメソッドでは、再ロードされても使用できません.子クラスが親クラスのメソッドの一部を書き換えた場合、そのメソッドを呼び出すときは、必ず子クラスで定義されたメソッド(動的接続、動的呼び出し)を使用します.
3、継承チェーンにおけるオブジェクトメソッドの呼び出しの優先度:this.show(O)、super.show(O)、
this.show((super)O)、super.show((super)O).つまり、thisオブジェクトの親を先に調べ、パラメータの親を再確認する必要はありません.
一、多態とは何か
次は多態の存在の3つの必要条件で、みんなが夢を見る時すべて暗記することができることを要求します!
多態が存在する3つの必要条件1、継承しなければならない.二、書き直さなければならない.三、親参照は子オブジェクトを指します.
二、多態のメリット:
1.代替性(substitutability).マルチステートは、既存のコードに置換可能です.たとえば、マルチステートは円Circleクラスに対して動作し、円環などの他の任意の円形ジオメトリに対しても同様に動作します.2.拡張性(extensibility).マルチステートはコードに対して拡張性を有する.新しいサブクラスを追加すると、既存のクラスの多態性、継承性、およびその他の特性の実行および操作に影響しません.実際には,新しいサブクラスはマルチステート機能を容易に得ることができる.例えば、円錐、半円錐および半球の多態を実現した上で、球体類の多態性を容易に加えることができる.3.インタフェース性(interface-ability).マルチステートは、メソッド署名によって、サブクラスに共通のインタフェースを提供し、サブクラスによってそれを改善または上書きすることによって実現される.図8.3に示すように.図中のスーパークラスShapeは、2つのマルチステートを実現するインタフェース方法、computeArea()およびcomputeVolume()を規定している.CircleやSphereのようなサブクラスは,マルチステートを実現するために,この2つのインタフェースメソッドを補完または上書きする.4.柔軟性(flexibility).応用において柔軟で多様な操作を体現し、使用効率を高めた.5.簡略化(simplicity).マルチステート簡略化はアプリケーションソフトウェアのコード作成と修正プロセスを簡略化し、特に大量のオブジェクトの演算と操作を処理する際に、この特徴は特に際立って重要である.
Javaにおけるマルチステートの実装方式:インタフェース実装,親を継承してメソッド書き換え,同じクラスでメソッド再ロードを行う.
三、経典の実例.
, 。 , 。 ,
http://blog.sina.com.cn/s/blog_5fd19dd60102wmvp.html public class A {
public String show(D obj) {
return ("A and D");
}
public String show(A obj) {
return ("A and A");
}
}
public class B extends A{
public String show(B obj){
return ("B and B");
}
public String show(A obj){
return ("B and A");
}
}
public class C extends B{
}
public class D extends B{
}
public class Test {
public static void main(String[] args) {
A a1 = new A();
A a2 = new B();
B b = new B();
C c = new C();
D d = new D();
System.out.println("1--" + a1.show(b));
System.out.println("2--" + a1.show(c));
System.out.println("3--" + a1.show(d));
System.out.println("4--" + a2.show(b)); //4--B and A . a2 A ,B , show(B b) , A , B show(B b) ( ), :this.show(O)、super.show(O)、this.show((super)O)、super.show((super)O), this , 。 super.show((super)O) ,B , , A show(A a), 。
System.out.println("5--" + a2.show(c)); //
System.out.println("6--" + a2.show(d)); //A and D . B show(D d) , A , , 。
System.out.println("7--" + b.show(b));
System.out.println("8--" + b.show(c)); //B and B .
System.out.println("9--" + b.show(d));
}
}
:
1--A and A
2--A and A
3--A and D
4--B and A
5--B and A
6--A and D
7--B and B
8--B and B
9--A and D