多型には2つのタイプがあります。
1)同じ名前の複数の方法の多型をコンパイルするとき、コンピレーション中に同じ名前を実行する方法のいずれのいずれかを判断できれば、コンパイル時に多型と呼ばれます。
2)編集中に多型が決定されない場合、ランタイム中の同じ名前のいずれの方法が実行時に多型と呼ばれるかを決定することのみができます。
メソッドは、2種類の多型をカバーします。オブジェクトがこのカテゴリを取得すると、それは次のようなコンパイル時の多型です。
xxxx x1 = new xxxx(パラメーターリスト);
xxx xx1 = new xxx(パラメーターリスト);
x1.tstring();
xx1.tstring();
xxxxはxxxの親クラスです。
sub -objectは親クラスオブジェクトとサブクラスオブジェクトに互換性が割り当てられ、親クラスオブジェクトにサブクラスオブジェクトとして割り当てることができます。
xxxx x2 = new xxx(パラメーターリスト);
x2.toString();
X2ステートメントは親クラスのインスタンスですが、サブクラスXXXを取得します。
これらは2つのケースに分かれています。
サブクラスが親の方法をカバーしているかどうかに応じて、サブクラスメソッドが実行されます。
カバレッジがない場合、親メソッドが実行されます。
コンパイルするとき、オブジェクトのクラスによると、システムは最終的に実行する必要がある方法を決定することができず、ランタイムの場合にのみ決定することができるため、これは実行時に多形です。
親クラスはすべてのサブクラスメソッドを実行せず、それらの親クラス/サブクラスでカバーされているサブクラスメソッドのみを実行できます。
Java Polymorphismの実装
Javaの多型とC ++は、実行時に動的な結合または結合によって実現されます。コンパイラは、この参照が変数ステートメント中に説明されたタイプオブジェクトを指しているのか、それともタイプのサブクラスのオブジェクトを指しているかをコンパイラが知らないため、オブジェクトによって参照されるメソッドを呼び出すとき。したがって、コンパイラをこの呼び出しの特定の方法にバインドすることはできません。 Java(RTT)を介して実行されるタイプ認識(RTT)のみが、実行時に特定の方法にバインドされます
無効化とメソッドの再負荷の過負荷の書き換えは、Java多型の異なる症状です。コントロールオーバーライドは親とサブクラスの間の多型であり、再負荷の過負荷はクラスの多型症状です。
具体的な例を挙げてください:
class People {public string toString(){I Am A People! "; };} class girl experns people {public string toString(){return "i a a girl!" public void sing(){};} public class testtring {public static void(string argss []){Peical P = new Girl();
結果を実行します:
私は女の子です!
Pは人への参照ですが、それはRuntの女の子のオブジェクトだからです
Java多型の詳細な理解
免責事項、ここの他のクラスメートの例、元のリンク:http://blog.csdn.net/thinkghoster/article/details/2307001
テストトピック
クラスA {public String show(d obj){return "a and d";} public string show(a obj){return "a as";} public string show(a obj ){return "b and a";} class cはb {} class d extends b {} public static void main(strags []){a1 = a a2 = new b(); b b = new c = new d = new d(aout.println; ; // 2 System.out.println(d)); ); // 5 system.println(d)) c));
答え
AおよびAAとAAとDBとABとAAとBBとBAとD
分析私はこのトピックをすべて行い始めました。
まず、書き換えと過負荷を深く理解する必要があります。
第二に、この文の深い理解では、「スーパークラスオブジェクトが変数を参照する場合、サブクラスオブジェクトを参照する場合、参照変数ではなく参照オブジェクトのタイプがメンバーメソッドを決定しますが、この呼び出し方法はスーパークラスでなければなりません。その中に定義されています。つまり、サブクラスによる書き換えの方法 ""
次に、これらの質問を分析しましょう
質問:Bが親のショー方法を書き直したと思いますか?書き換えたら、何人書き直しましたか?
回答:書き直され、書き直されたもの、つまりパブリックストリングショー(obj)、なぜパブリックストリングショー(B obj)があるのですか?
例分析
上記の分析を読んだ後、2つの例も分析します。
1。a2.show(b):
A2は参照変数、タイプA、BはBのインスタンスです。まず第一に、クラスAでショー(B obj)を見つけますが、見つかりません。だから私はAのスーパークラスに行ったが、aはスーパークラスを持っていなかったので、私はa.(super)b)、(super)bに頼ったので、私はショー(obj)メソッドを見つけました。 、しかし、A2で参照されるクラスBのオブジェクトにより、BはAのショー(A OBJ)メソッドを書き直したため、最終的にクラスBのショー(A OBJ)にロックされます。出力は「BとA」です。
2。a2.show(c):
A2は参照変数、タイプA、BはBのインスタンスです。まず第一に、クラスAでショー(C OBJ)を見つけますが、見つかりません。だから私はそれをAのスーパーカテゴリーで見つけ、Aはスーパークラスを持っていなかったので、私はA.((スーパー)c)、(スーパー)cに頼りました。 a2 a2になる.show(b)の問題、およびa2.show(b)の問題は出力「bおよびa」として分析されているため、ここに出力「bとa」もあります。