オブジェクト指向の3つの主要な特徴があります:カプセル化、相続、および多型。特定の観点から、カプセル化と相続は、ほぼすべて多型に備えています。これが私たちの最後の概念であり、最も重要な知識ポイントです。
1。定義:
多型:異なるタイプのオブジェクトが同じメッセージに応答できるようにすることを指します。つまり、同じメッセージが送信されたさまざまなオブジェクトに従って、さまざまな異なる動作を採用することができます。 (メッセージの送信は機能呼び出しです)
2。多型を実装する技術は、次のように呼ばれます。これは、実行中に参照されるオブジェクトの実際のタイプを判断し、実際のタイプに従って対応する方法を呼び出すことを指します。
3。機能:タイプ間の結合関係を排除します。
4。実際には、多型の無数の例があります。たとえば、AS3ヘルプドキュメントが現在フラッシュインターフェイスの下にポップアップされている場合、F1キーを押します。単語のヘルプが現在、単語の下にポップアップされている場合。 Windowsヘルプが現在Windowsヘルプとサポートの下にポップアップされている場合。同じイベントが異なるオブジェクトで発生し、異なる結果が生成されます。
5。以下は、多型の存在に必要な3つの条件であり、誰もが夢を見るときにそれを暗記する必要があります!
多型に必要な3つの条件
1.継承が必要です。
2。書き換えなければなりません。
3.親クラスの参照は、子クラスオブジェクトを指します。
6。多型の利点:
1)代替性:多型には、既存のコードの互換性があります。たとえば、多型はサークルサークルクラスで機能し、サークルなどの他の円形の形状でも機能します。
2)拡張性:多型はコードに拡張可能です。新しいサブクラスを追加しても、既存のクラスの多型、相続、およびその他の特性の操作と操作には影響しません。実際、新しいサブクラスを追加することにより、多型機能を取得する方が簡単です。たとえば、コーン、セミコーン、半球の多型を実現することに基づいて、球体の多型を簡単に追加できます。
3)インターフェイス性:多型は、メソッドシグネチャを介してスーパークラスによって達成され、サブクラスに共通のインターフェイスを提供し、サブクラスを改善または上書きすることで実装されます。図8.3に示すように。図では、スーパークラスの形状は、多型、ComputEEREA()とComputeVolume()を実装する2つのインターフェイスメソッドを指定します。サークルや球体などのサブクラスは、多型を達成するために、これら2つのインターフェイス方法を改善またはオーバーライドします。
4)柔軟性:アプリケーションの柔軟で多様な操作を反映し、使用効率を向上させます。
5)シンプルさ:多型は、特に多数のオブジェクトの操作と操作を扱う場合、アプリケーションソフトウェアのコード作成と変更プロセスを簡素化します。この機能は特に顕著で重要です。
猫と犬のケースコード
class Animal {public void eat(){system.out.println( "eat");} public void sleep(){System.out.println( "sleep");}} class dog extens {public void eat(){system.out.println( "dog eat meat");} public boid sleep動物{public void eat(){system.out.println( "cat eat fish");} public void sleep(){system.out.println( "猫はおなかで眠ります") {system.out.println( "豚はその側で眠ります") c.sleep(); } //犬の関数を呼び出すpublic static void sudog(dog d){d.eat(); d.sleep(); } //豚の関数を呼び出すpublic static void usepig(pig p){p.eat(); p.sleep(); } */public static void useanimal(animal a){a.eat(); a.sleep();} //動物へのすべての可能性のすべての可能性} class duotaidemo2 {public static void main(// string [] args){//猫が好きです。 cat(); c2.eat(); c2.sleep(); //特に猫が好きで、別の猫c3 = new猫(); c3.eat(); c3.sleep(); // ... system.out.println( "-------------------"); //問題は、問題を育てました。この方法を呼んで、あなたはそれが非常に似ていると思いませんか?オブジェクト名が異なるというだけです。 //メソッドを使用して改善することを計画しています//メソッドを呼び出してバージョンを改善する// usecat(c); // usecat(c2); // usecat(c3); // animaltool.usecat(c); // animaltool.usecat(c2); // animaltool.usecat(c2); // animaltool.usecat( c3); AnimalTool.USEANIMAL(C2); AnimalTool.Useanimal(C2); AnimalTool.Useanimal(c3); system.out.println( "------------------------"); // i犬のように犬のようにd = new dog();犬d2 = new dog();犬d3 = new dog(); // animaltool.usedog(d); // animaltool.usedog(d2); // animaltool.usedog(d3); animaltool.useanimal(d); animaltool.useanimal(d2); animaltool.useanimal( d2);AnimalTool.useAnimal(d3);System.out.println("-------------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Pig(); // AnimalTool.Usepig(P); // AnimalTool.Usepig(P2); // AnimalTool.Usepig(P3); AnimalTool.Useanimal(P2); AnimalTool.Useanimal(P2); AnimalTool.useanimal(P3); System.out.out.out.out.Out;ヒョウ... static void usecat(c.eat()}7. Javaにおける多型の実装方法:インターフェイスの実装、メソッド書き換えのために親クラスの継承、および同じクラスでのメソッドの過負荷。
8。Javaにおける多型の分類:
Javaでは、多型を次の状況にほぼ分けることができます。
1)人は親のクラスであり、学生は子供のクラスです。次に:personp = newStudent();
2)Fliableはインターフェイスであり、Birdはインターフェイスを実装するクラスです。
3)Fliableは抽象的なクラスであり、BirdはFliableを継承するクラスです。
多型の場合、Pは親クラスへの参照として宣言されることを述べる必要がありますが、実際には子のクラスへの言及です。しかし、彼は親クラスでのみメソッドを呼び出すことができます。サブクラスのメソッドが親クラスメソッドをオーバーライドする場合、親クラスメソッド(仮想メソッド呼び出し)が呼び出されます。同じことがインターフェースの多型にも当てはまります。たぶん、Fが独自の方法を呼び出したい場合、それは間違いを犯しませんか?実際、これはメソッドカバレッジでもあります。インターフェイスを実装するサブクラスは間違いなくインターフェイスにメソッドを実装するため、この場合は鳥のメソッドが呼び出されます。しかし、鳥にインターフェイスで定義されていない方法がある場合、fは呼び出すことはできません。
9.オペレーターの内容:
Java言語の多型メカニズムにより、参照変数の宣言タイプが実際の参照オブジェクトのタイプと矛盾します。仮想メソッド呼び出しルールと組み合わせることで、同じタイプとして宣言された2つの参照変数も、同じ方法を呼び出すときに異なる動作を持つ可能性があると結論付けることができます。オペレーターのインスタンスはここに紹介されています。
したがって、personp = newStudent()を宣言した場合。 Pを学生に変換できますか?もちろん、それはできますが、それは強制されなければなりません(息子は父親になりたいと思っており、彼は直接来ますが、父親が息子になりたいなら、彼は強制されます)。
通常、インスタンスはキャスト時に追加されます。
if(pinstanceofStudent){desution =(desute)p;}
多型は、Java学習全体を通して実行されます。たとえば、例外を処理する際にキャッチステートメントを書く場合、サブクラスの例外は前面に記述する必要があり、親クラスの例外を背面に記述する必要があると規定しています。なぜ?その理由は多型です。キャッチステートメント形式:catch(Exceptione)。例外が生成されると、Javaプログラムは例外オブジェクトを自動的に生成します。子クラスの例外が最初に生成され、親クラスの例外が前面に記述された場合、このCACTステートメントはポリ型に従って間違いなく実行され、CACTステートメントを実行した後に飛び出します。
10。例:
Javaの多型をよく理解していませんが、次の例では、いくつかを理解しています。
クラスA {public String show(d obj).. {return( "a and d");} public string show(a obj).. {return( "a and a");}} class bは{return( "b and b");} public string show(a obj).. {bend( "b and(" b and( "b and(" b and( "b and)class)).. b {} class e {public static void main(string [] args){a a1 = new a(); a2 = new b(); b b = new b(); c c = new c(); d d = new d(); system.out.println(a1.show(b));//①system.out.println(a1.show(c)); // //③system.out.println(a2.show(b));///④system.out.println(a2.show(c));///⑤system.out.Out.println(a2.print);///////////// ⑥system.out.println(b.show(b)); //(iii)答え
①aおよびa②aおよびa③aおよびd④bおよびa⑤bおよびa⑥aとd⑦bおよびb⑧bおよびd
****良い人の答えがあります****
この問題には2つの重要なポイントがあります。
1つはサブクラスと親クラスの関係であり、もう1つは過負荷の方法を呼び出す問題です。
サブクラスオブジェクトは、親オブジェクトとして直接使用できますが、それ以外の場合はできません。たとえば、人々は親クラスであり、学生は人のサブクラスであるため、学生のオブジェクトには人間のオブジェクトの属性を持っている必要がありますが、人間のオブジェクトには必ずしも学生のオブジェクトの特性があるとは限りません。したがって、学生のオブジェクトは人間のオブジェクトとして使用できますが、人間のオブジェクトは学生のオブジェクトとして使用することはできません。サブクラスオブジェクトを親オブジェクトとして使用する場合、サブクラスオブジェクトはすべてのサブクラス特性を失い、親クラスと同じ名前の属性とメソッドのみを保持することに注意してください(同じ名前のメソッドは同じ関数名だけでなく、パラメータータイプも同じである必要があります。
クラスでオーバーロードされたメソッドが定義されている場合、システムは、メソッドを呼び出すときにパラメーターのタイプに従って適切なメソッドを自動的に選択および呼び出します。
1)a1.shows(b)、AにクラスBパラメーターを含むメソッドはありませんが、クラスAパラメーターを含むメソッドは、サブクラスオブジェクトの親クラスが利用可能であるという原則に従って呼び出されます。
publicStringshow(Aobj)...{return("AandA");}
2)a1.show(c)、クラスCはクラスBのサブクラスであり、クラスBはクラスAのサブクラスであるため、クラスCオブジェクトはクラスAオブジェクトとして使用できます。結果は上記と同じです。
3)a1.show(d)、パラメータータイプに従ってAでメソッドを直接呼び出す
publicStringshow(Dobj)...{
return("AandD");}
4)a2.show(b)、a2は元々はBオブジェクトでしたが、クラスA変数に割り当てられたため、A2は親クラスAと同じ名前のプロパティとメソッドのみを保持します。
public String show(A obj)...{
return ("B and A");
}
5)a2.show(c)、クラスBの予約メソッドにはクラスCパラメーターメソッドがありませんが、Cを含む親クラスBにはパラメーターメソッドがあるため、呼び出される方法があります。
public String show(A obj)...{
return ("B and A");
}
この説明はより合理的だと思います。A2は元々クラスBのオブジェクトでしたが、値はクラスAに割り当てられ、CはBのサブクラスであり、BはAのサブクラスであるため、A2はAと同じ名前のクラスBのプロパティとメソッドを保持します。
6)a2.show(d)、呼び出しはクラスAからですpublic String show(D obj)...{
return ("A and D");
}
7)b.show(b)、電話してください
public String show(B obj)...{
return ("B and B");
}
8)B.Show(C)、クラスBにはCパラメーターにはメソッドがありませんが、Bパラメーターにはメソッドがあるため、メソッドは呼び出されます
public String show(B obj)...{
return ("B and B");
}
9)B.Show(d)、説明は8と同じです
要約します
上記は、この記事のJava Polymorphismの要約の内容全体であり、誰にとっても役立つことを願っています。ご質問がある場合は、いつでもメッセージを残して、貴重なコメントを楽しみにしてください。