ในชวา polymorphism แบ่งออกเป็นสองประเภท: คอมไพล์เวลา polymorphism (overload) และ polymorphism run-time (overwrite) ความหลากหลายของการรวบรวมเวลาเรียกอีกอย่างว่าการผูกมัดก่อนและความหลากหลายในเวลาเรียกใช้เรียกว่าหลังการผูกมัด
นี่คือตัวอย่าง:
คลาสสาธารณะ overloadandOverWrite {โมฆะคงที่สาธารณะหลัก (String [] args) {a a1 = ใหม่ a (); a2 = ใหม่ b (); b b = ใหม่ b (); c c = ใหม่ c (); d d = new d (); System.out.print ("a1.print (a1):"); a1.print (a1); // output a และ a system.out.print ("a1.print (b):"); a1.print (b); // output a และ a: เหตุผลคือไม่มีวิธีการกับพารามิเตอร์ B ใน a ดังนั้นวิธีที่มีพารามิเตอร์ A จะถูกเรียกเพราะ b คือ system.out.print ("a1.print (c):"); a1.print (c); // output a และ a: เหตุผลคือไม่มีวิธีการที่มีพารามิเตอร์ C ใน A ดังนั้นวิธีการที่มีพารามิเตอร์ A จะถูกเรียกเพราะ C ได้รับการสืบทอดจาก B และ B และ B นั้นสืบทอดมาจาก System.out.print ("A1.print (d):"); a1.print (d); // output a และ d: เหตุผลคือเนื่องจากมีวิธีการที่มีพารามิเตอร์ d ใน a, วิธีที่มีพารามิเตอร์ d จะเรียกว่า system.out.print ("a2.print (b):"); a2.print (b); // output b และ a: เหตุผลคือรายการคือ A ก่อนตรวจสอบว่ามีวิธีการพิมพ์ที่มีพารามิเตอร์ B ใน A. หากคุณพบว่าไม่มีหรือไม่จากนั้นมองหาวิธีการที่มีพารามิเตอร์ A. เพราะ B สืบทอดจาก A. ฉันพบว่ามีวิธีการดังกล่าว จากนั้นตรวจสอบอีกครั้งว่าวิธีนี้ได้รับการเขียนใหม่ใน B จะพบว่ามีวิธีการเขียนใหม่หรือไม่ เรียกใช้วิธีการเขียนใหม่โดยตรง system.out.print ("a2.print (c):"); a2.print (c); // เอาท์พุท B และ A: เหตุผลก็คือรายการคือ A. ก่อนตรวจสอบว่ามีวิธีการพิมพ์ที่มีพารามิเตอร์ C ใน A หากไม่มีหรือไม่ให้ดูว่ามีวิธีการที่มีพารามิเตอร์ B. หรือไม่เนื่องจาก C ได้รับการสืบทอดจาก B และไม่มีวิธีการดังกล่าว System.out.print ("a2.print (d):"); a2.print (d); // output a และ d: เหตุผลคือรายการคือ A. หากมีวิธีการที่มีพารามิเตอร์ d ใน A ตรวจสอบว่าวิธีนี้ไม่ได้ถูกเขียนใหม่ใน B ดังนั้นผลลัพธ์ของวิธีนี้ในเอาต์พุต IS; System.out.print ("a2.print (a2):"); a2.print (a2); // output b และ a; เหตุผลคือประเภทของ A2 คือ A ดังนั้นวิธีการพิมพ์ที่มีพารามิเตอร์ A ใน A จะถูกเรียก แต่วิธีใหม่ทางด้านขวาของ A2 คือ B ดังนั้นเนื่องจากมีวิธีการที่มีพารามิเตอร์ A ใน B วิธีการนี้ใน B b.print (b); // output b และ b; เหตุผล: รายการคือ B ดังนั้นตรวจสอบว่าฟังก์ชั่นการพิมพ์ที่มีพารามิเตอร์ B มีอยู่ใน B หรือไม่และหากมีเอาต์พุตโดยตรงหรือไม่ System.out.print ("b.print (c):"); b.print (c); // output b และ b; เหตุผล: รายการคือ B ดังนั้นหากคุณดูว่าฟังก์ชั่นการพิมพ์ที่มีพารามิเตอร์ C มีอยู่ใน B หากคุณพบว่าไม่มีอยู่คุณจะเห็นว่าฟังก์ชั่นการพิมพ์ที่มีพารามิเตอร์ B มีอยู่หรือไม่ หากคุณพบว่ามีอยู่และหากวิธีการไม่ได้เขียนใหม่ใน C คุณจะส่งออกโดยตรง สิ่งหนึ่งที่ควรทราบคือคุณต้องตรวจสอบว่าวิธีการพิมพ์ด้วยพารามิเตอร์ C มีอยู่ใน A หรือไม่เพราะ B สืบทอดจาก A หากมีคุณจะใช้วิธีนี้กับผลลัพธ์ ด้วยวิธีนี้ผลลัพธ์ผลลัพธ์จะกลายเป็น a และ c system.out.print ("b.print (d):"); b.print (d); // output a และ d; เหตุผล: รายการคือ B แม้ว่าจะไม่มีฟังก์ชั่นการพิมพ์ที่มีพารามิเตอร์ D ใน B, B, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, output เป็นผลของพารามิเตอร์ d ใน a; }} คลาส A {public void print (a) {system.out.println ("a และ a"); } public void print (d d) {system.out.println ("A และ D"); } // โมฆะสาธารณะพิมพ์ (C C) // {// System.out.println ("A และ C"); //}} คลาส B ขยาย {public void print (b b) {system.out.println ("B และ B"); } public void print (a) {system.out.println ("b และ a"); }} คลาส C ขยาย B {} คลาส D ขยาย C {}สิ่งที่ต้องอธิบายที่นี่คือ:
สำหรับ a2 = ใหม่ b ();
หาก A2 ถูกพิมพ์แยกกันผลการพิมพ์คือ B@(รหัสแฮช) แทน@(รหัสแฮช) แต่นี่ไม่ได้หมายความว่าประเภทของ A2 เป็นประเภท B เพราะเมื่อเราเรียก A2.print (A2); ในโปรแกรมข้างต้นผลลัพธ์ผลลัพธ์คือ B และ A แทน A และ A (ถ้า A2 ถือว่าเป็น B วิธีการพิมพ์ที่มีพารามิเตอร์ B ในคลาส A ควรเรียกเพราะไม่มีวิธีการดังกล่าวดังนั้นตัวเลือกที่สองในการเรียกวิธีการที่มีพารามิเตอร์ A ควรเอาต์พุต A และ A เนื่องจาก B เป็นคลาสย่อยของ A)
ข้างต้นคือการวิเคราะห์รหัสตัวอย่างของการเขียนซ้ำและการโอเวอร์โหลด ฉันหวังว่ามันจะเป็นประโยชน์กับนักเรียนที่เรียน Java