الارتباك حول كلونيابل واجهة الكائن.استنساخ() في جافا

StackOverflow https://stackoverflow.com/questions/1067383

  •  21-08-2019
  •  | 
  •  

سؤال

إذا كنت قد:

class foo implements Cloneable

ومن ثم القيام:

bar = new foo();
bar.clone();

أحصل على نسخة الضحلة دون الحاجة لكتابة أي bar.clone() رمز مثل عادة سوف تحتاج إلى القيام به عندما كنت تنفيذ واجهة.

ما أفهمه هو أن واجهة وظائف يجب أن تملأ من قبل الطبقة تنفيذ ذلك ، Object.clone() قد لا تنفيذ (حسب مستندات, "كائن الفئة نفسها لا تنفذ واجهة كلونيابل")

لذا أين الضحلة استنساخ تأتي من ؟ أين هو التعليمات البرمجية التي تنفذ bar.clone() إذا Object.clone() لا يوجد لديه التنفيذ ؟ أنا في حيرة.

هل كانت مفيدة؟

المحلول

وأن <م> حذرين للغاية باستخدام استنساخ. في الواقع، أود أن تجنب ذلك تماما. لدي <م> لا الحاجة إليها. ولكن ... أن يقال، أفضل مناقشة الموضوع لقد قرأت من أي وقت مضى هي عن طريق جوشوا بلوك، في جاوة الفعالة. قراءة البند 11: "تجاوز استنساخ بحكمة"

وPLEASE لا لنفسك صالح وقراءة هذا البند. أنا فعلا يوصي قراءة هذا الفصل بأكمله (والباقي من الكتاب). كل ما تحتاج لمعرفته حول استنساخ والسبب في أنني كنت الحذر حول هذا الموضوع هو في وجود.

وآمل أن يساعد هذا.

نصائح أخرى

وObject.clone () لديه التنفيذ:

HTTP: // java.sun.com/j2se/1.5.0/docs/api/java/lang/Object.html#clone ()

وهذا رابط يشرح واجهة Cloneable: http://java.sun.com/j2se /1.5.0/docs/api/java/lang/Cloneable.html

وكائن يجب تنفيذ واجهة Cloneable من أجل استدعاء الأسلوب استنساخ ()، وإلا، فإنه يلقي CloneNotSupportedException.

وبحكم التعريف، جميع الطبقات في جاوة تمتد فئة كائن قاعدة، والطبقة كائن لديه نسخة الافتراضي طريقة ()، على الرغم من كائن نفسه لا يقوم Cloneable. وسوف يطلق استنساخ طريقة فئة كائن في () إذا كنت لا تجاوز ذلك بنفسك.

<اقتباس فقرة>   

وإذا كان لدي: "تنفذ فو الطبقة   cloneable "

     

وبعد ذلك القيام به: شريط = فو جديد ()؛   bar.clone ()؛

     

وأحصل على نسخة الضحلة دون الحاجة   لكتابة أي رمز bar.clone () وكأنني   عادة سوف تحتاج إلى القيام به عندما كنت   تطبيق واجهة.

وهذا من شأنه أن يعمل فقط إذا كنت اصفا اياه بانه داخل الطبقة "فو"، لأن أسلوب .clone () الموروثة من Object محمي.

<اقتباس فقرة>   

وما أفهمه هو أن   يجب ملء وظائف واجهة ل   في الطبقة تنفيذها، و   Object.clone () لا يوجد لديه التنفيذ   (وفقا للمستندات، "كائن من الدرجة   لا نفسه تنفيذ   واجهة Cloneable ")

و(1) Object.clone() لا يكون لها التنفيذ. فإنه يجعل نسخة الضحلة للكائن إذا كان الكائن تنفذ Cloneable. (2) طريقة .clone() ليس جزءا من أي واجهة. (3) وجود طريقة .clone() وتنفيذ واجهة Cloneable هي الأشياء منفصلة تماما. تحتاج فقط إلى تنفيذ واجهة Cloneable إذا كنت تنوي الاستفادة من طريقة Object clone؛ و ومع ذلك، هذه هي الطريقة الموصى بها لكتابة طريقة clone للفئة الخاصة بك - للحصول على نسخة لها من طريقة clone الفائقة، والذي يذهب في نهاية المطاف إلى طريقة Object clone ل

ما أفهمه هو أن واجهة وظائف يجب أن تملأ من قبل الطبقة وضع هذا الكائن.استنساخ() لا يوجد لديه التنفيذ (حسب مستندات, "كائن الفئة نفسها لا تنفذ واجهة كلونيابل")

هناك فرق بين أن نقول الكائن.استنساخ() لا يوجد لديه التنفيذ و كائن الفئة نفسها لا تنفذ واجهة كلونيابل

الكائن استنساخ الطريقة لا يكون التنفيذ ، فإنه الذاكرة-نسخة من الكائن الذي يسمى استنساخ الطريقة.

أنت على حق, فئة كائن لا ينفذ كلونيابل, كل ما يفعله هو الاختيار الكائن كلونيابل أو لا .

الإجابة أعلاه نقطة لك لقراءة بعض الكتب, أعتقد أنني يمكن أن تعطي حل سريع لذا للإجابة على سؤالك

لذا أين الضحلة استنساخ تأتي من ؟ الكائن استنساخ طريقة

أين هو التعليمات البرمجية التي تنفذ بار.استنساخ() إذا كان الكائن.استنساخ() لا يوجد لديه التنفيذ ؟ وقد التنفيذ مكتوب في التعليمات البرمجية الأصلية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top