polymorphism มีสองประเภท:
1) เมื่อรวบรวม polymorphism สำหรับหลายวิธีที่มีชื่อเดียวกันถ้าคุณสามารถกำหนดวิธีหนึ่งในการดำเนินการชื่อเดียวกันในระหว่างการรวบรวมมันจะเรียกว่า polymorphism เมื่อรวบรวม
2) หากไม่ได้กำหนด polymorphism ในระหว่างการรวบรวมมันสามารถกำหนดได้เพียงหนึ่งในวิธีการของชื่อเดียวกันในระหว่างการรันไทม์ที่เรียกว่า polymorphism ในเวลาของรันไทม์
วิธีการครอบคลุม polymorphism สองประเภท
xxxx x1 = new xxxx (รายการพารามิเตอร์);
xxx xx1 = new xxx (รายการพารามิเตอร์);
X1.TSTRING ();
XX1.TSTRING ();
XXXX เป็นคลาสแม่ของ XXX
เนื่องจาก sub -Object ไม่เพียง แต่วัตถุพาเรนต์วัตถุคลาสแม่และวัตถุย่อย -class จึงมีการกำหนดความเข้ากันได้และวัตถุคลาสพาเรนต์สามารถกำหนดเป็นวัตถุย่อย -class
xxxx x2 = new xxx (รายการพารามิเตอร์);
x2.tostring ();
คำสั่ง x2 เป็นอินสแตนซ์ของคลาสพาเรนต์ แต่ได้รับ XXX ย่อย
สิ่งเหล่านี้แบ่งออกเป็นสองกรณี:
ขึ้นอยู่กับว่า subclass ครอบคลุมวิธีการหลักหรือไม่
หากไม่มีความคุ้มครองวิธีการหลักจะถูกดำเนินการ
เมื่อรวบรวมตามคลาสของวัตถุระบบไม่สามารถกำหนดวิธีการที่ควรดำเนินการในตอนท้ายและสามารถกำหนดได้ก็ต่อเมื่อรันไทม์เท่านั้นดังนั้นนี่คือ polymorph ที่รันไทม์
คลาสพาเรนต์ไม่ได้ดำเนินการวิธีการย่อยทั้งหมดและสามารถดำเนินการเฉพาะวิธีย่อยที่ครอบคลุมในคลาสพาเรนต์/คลาสย่อยเหล่านั้นเท่านั้น
การใช้งาน Java Polymorphism
polymorphism และ C ++ ของ Java ได้รับการรับรู้โดยการผูกมัดแบบไดนามิกหรือการผูกมัดที่รันไทม์ เมื่อเรียกวิธีการอ้างอิงโดยวัตถุเนื่องจากคอมไพเลอร์ไม่ทราบว่าการอ้างอิงนี้ชี้ไปที่วัตถุประเภทที่อธิบายระหว่างคำสั่งตัวแปรหรือวัตถุของคลาสย่อยประเภท ดังนั้นคอมไพเลอร์ไม่สามารถผูกมัดกับวิธีการเฉพาะสำหรับการโทรนี้ เฉพาะประเภทการจดจำ (RTT) ที่ทำงานผ่าน Java (RTT) เท่านั้นที่ถูกผูกไว้กับวิธีการเฉพาะที่รันไทม์
การเขียนซ้ำอีกครั้งและการโหลดการโอเวอร์โหลดของวิธีการที่มากเกินไปเป็นการรวมตัวกันที่แตกต่างกันของความหลากหลายของ Java การควบคุมการเอาชนะเป็นความหลากหลายระหว่างผู้ปกครองและคลาสย่อย
ยกตัวอย่างเฉพาะ:
คนชั้นเรียน {Public String ToString () {return "ฉันเป็นคน!"; };} ชั้นเรียนสาวขยายคน {Public String ToString () {return "ฉันเป็นผู้หญิง!" โมฆะสาธารณะร้องเพลง () {}; []) {peical p = สาวใหม่ ();
เรียกใช้ผลลัพธ์:
ฉันเป็นผู้หญิง!
P คือการอ้างอิงถึงผู้คน แต่เพราะมันเป็นวัตถุหญิงที่ Runt
ในความเข้าใจเชิงลึกของ Java polymorphism
ข้อจำกัดความรับผิดชอบตัวอย่างของเพื่อนร่วมชั้นอื่น ๆ ที่นี่ลิงค์ดั้งเดิม: http://blog.csdn.net/thinkghoster/article/details/2307001
หัวข้อทดสอบ
Class A {Public String Show (D OBJ) {return "A และ D";} Public String Show (A OBJ) {return "A" ) {return "b และ a";} คลาส C ขยาย b {} คลาส D ขยาย b {} โมฆะคงที่สาธารณะหลัก (st rags []) {a a1 = ใหม่ a (); B = ใหม่ B (); ); ); c));
คำตอบ
A และ AA และ AA และ DB และ AB และ AA และ DB และ BB และ BA และ D
การวิเคราะห์ฉันเริ่มทำหัวข้อนี้
ก่อนอื่นเราต้องเข้าใจการเขียนใหม่และโอเวอร์โหลดอย่างลึกซึ้ง
ประการที่สองในความเข้าใจอย่างลึกซึ้งของประโยคนี้ "เมื่อวัตถุ super -class อ้างอิงตัวแปรตัวแปรวัตถุย่อยการอ้างอิงวัตถุประเภทของวัตถุอ้างอิงแทนที่จะเป็นตัวแปรอ้างอิงกำหนดวิธีการสมาชิก แต่วิธีการโทรนี้ต้องอยู่ในคลาสซูเปอร์ ถูกกำหนดไว้ในนั้นนั่นคือวิธีการเขียนใหม่โดย sub -class ""
จากนั้นลองวิเคราะห์คำถามเหล่านี้
คำถาม: คุณคิดว่า B เขียนวิธีการแสดงของ Parent A หรือไม่? หากคุณเขียนใหม่ให้เขียนใหม่กี่ครั้ง?
คำตอบ: เขียนใหม่, เขียนใหม่นั่นคือสตริงสาธารณะแสดง (A OBJ) ทำไมสตริงสาธารณะถึงแสดง (B OBJ)?
การวิเคราะห์ตัวอย่าง
หลังจากอ่านการวิเคราะห์ข้างต้นเรายังวิเคราะห์สองตัวอย่าง:
1. a2.show (b):
A2 เป็นตัวแปรอ้างอิง Type A, B เป็นตัวอย่างของ B ก่อนอื่นให้ค้นหาการแสดง (b obj) ในคลาส A แต่ไม่พบ ดังนั้นฉันจึงไปที่ Super Class ของ A และ A ไม่มีคลาส Super ดังนั้นฉันจึงหันไปหา A. นี่ ((Super) B), (Super) B เป็น A ดังนั้นฉันจึงพบวิธีการแสดง (OBJ) ใน A แต่เนื่องจากวัตถุของคลาส B ที่อ้างอิงโดย A2, B rewritten การแสดงของ A (A OBJ) ดังนั้นในที่สุดมันก็ถูกล็อคไปที่รายการ (A OBJ) ของคลาส B เอาท์พุทคือ "B และ A"
2. A2.SHOW (C):
A2 เป็นตัวแปรอ้างอิง Type A, B เป็นตัวอย่างของ B ก่อนอื่นให้ค้นหาการแสดง (C OBJ) ในคลาส A แต่ไม่พบ ดังนั้นฉันจึงพบมันในหมวดหมู่สุดยอดของ A และ A ไม่มีคลาส Super ดังนั้นฉันจึงหันไปหา A. This ((Super) C), (Super) C เป็น B. จนถึงตอนนี้ A2.Show (C) นี้มี กลายเป็น a2 a2 ปัญหาของ. show (b) และ a2.show (b) ได้รับการวิเคราะห์ว่าเป็นผลลัพธ์ "B และ A" ดังนั้นที่นี่จึงเป็นเอาต์พุต "B และ A"