في Java ، ينقسم تعدد الأشكال إلى نوعين: تعدد الأشكال في وقت الترجمة (الحمل الزائد) وتعدد الأشكال في وقت التشغيل (الكتابة فوق). يُطلق على تعدد الأشكال وقت التجميع أيضًا ربط ما قبل الارتباط ، ويسمى تعدد الأشكال في وقت التشغيل أيضًا.
هنا مثال:
الفئة العامة overloadandoverwrite {public static void main (string [] args) {a a1 = new a () ؛ a2 = جديد b () ؛ B B = New 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) ؛ // الإخراج A و A: السبب هو أنه لا توجد طريقة مع المعلمة B في A ، وبالتالي سيتم استدعاء الطريقة مع المعلمة A ، لأن B هي system.out.print ("A1.PRINT (C):") ؛ a1.print (c) ؛ // الإخراج A و A: والسبب هو أنه لا توجد طريقة مع المعلمة C في A ، وبالتالي سيتم استدعاء الطريقة مع المعلمة A ، لأن C موروثة من B ، و B تراوحت من نظام. a1.print (d) ؛ // output a و d: السبب هو أنه نظرًا لوجود طريقة مع المعلمة d في a ، سيتم تسمية الطريقة مع المعلمة d system.out.print ("a2.print (b):") ؛ A2.print (B) ؛ // الإخراج B و A: السبب هو أن الإدخال هو A. أولاً ، تحقق مما إذا كانت هناك طريقة طباعة مع المعلمة B في A. إذا وجدت أنه لا ، فابحث عن طريقة مع المعلمة A. لأن B ويرث من A. لقد وجدت أن مثل هذه الطريقة موجودة. ثم تحقق مرة أخرى ما إذا كان قد تم إعادة كتابة هذه الطريقة في B. وقد وجد أن هناك طريقة إعادة كتابة. استدعاء مباشرة نظام إعادة الكتابة system.out.print ("a2.print (c):") ؛ A2.print (C) ؛ // الإخراج B و A: والسبب هو أن الإدخال هو A. أولاً ، تحقق مما إذا كانت هناك طريقة طباعة مع المعلمة C في A. system.out.print ("a2.print (d):") ؛ A2.print (D) ؛ // الإخراج A و D: السبب هو أن الإدخال هو A. إذا كانت هناك طريقة مع المعلمة D في A ، تحقق من أن هذه الطريقة لم تتم إعادة كتابة في B. لذلك ، نتيجة هذه الطريقة في A IS IS ؛ System.out.print ("A2.print (A2):") ؛ A2.print (A2) ؛ // Output B و A ؛ والسبب هو أن نوع A2 هو ، وبالتالي فإن طريقة الطباعة مع المعلمة A في A سوف تسمى ، ولكن الجديد على يمين A2 هو B ، لذلك لأن هناك طريقة مع المعلمة A في B ، يتم تبني هذه الطريقة في B system.out.print ("B.Print (B):") ؛ ") ؛ ب. السبب: الإدخال هو B ، لذا تحقق مما إذا كانت وظيفة الطباعة مع المعلمة B موجودة في B ، وإذا كان هناك إخراج مباشر ؛ System.out.print ("B.Print (C):") ؛ ب. السبب: الإدخال هو B ، لذلك إذا رأيت ما إذا كانت وظيفة الطباعة مع المعلمة C موجودة في B. إذا وجدت أنه غير موجود ، فأنت ترى ما إذا كانت وظيفة الطباعة مع المعلمة B موجودة. إذا وجدت أنه موجود ، وإذا لم تتم إعادة كتابة الطريقة في C ، فسوف تقوم بإخراجها مباشرة ؛ أحد الأشياء التي يجب ملاحظتها هو أنك تحتاج أيضًا إلى التحقق مما إذا كانت طريقة الطباعة مع المعلمة C موجودة في A ، لأن B يرث من A. إذا كان هناك أي ، فسوف تستخدم هذه الطريقة مع النتيجة. وبهذه الطريقة ، ستصبح نتيجة الإخراج A و C System.out.print ("B.Print (D):") ؛ ب. السبب: الإدخال هو B. على الرغم من عدم وجود وظيفة طباعة مع المعلمة D في B ، B المرث من A. }} class a {public void print (a) {system.out.println ("a and a") ؛ } public void print (d d) {system.out.println ("a and d") ؛ } // public void print (c c) // {// system.out.println ("a and c") ؛ //}} الفئة B يمتد {public void print (b b) {system.out.println ("b and b") ؛ } public void print (a) {system.out.println ("b and a") ؛ }} class 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).
ما سبق هو تحليل رمز مثال على إعادة الكتابة والتحميل الزائد. آمل أن يكون ذلك مفيدًا للطلاب الذين يدرسون جافا.