1 كائن أصلي محمي () يلقي clonenotsupportedException ؛
1. الطريقة المعدلة بواسطة الكلمات الرئيسية الأصلية
تشير الكلمة الرئيسية الأصلية في Java إلى أن هذه الطريقة هي طريقة محلية ، [Java Native Description]. علاوة على ذلك ، فإن كفاءة تنفيذ طرق التعديل الأصلي أعلى من تعديلات غير أصلية .
2. يتم تعديل الطريقة بواسطة محمية
عندما يتجاوز الفئة طريقة clone () ، يجب تعديلها في معدل وصول عام ، وذلك لضمان أن جميع الفئات الأخرى يمكنها الوصول إلى هذه الطريقة من هذه الفئة.
3. الطريقة يلقي clonenotsupportedException استثناء
إذا أراد فئة ما تجاوز طريقة clone () ، فيجب عليه تنفيذ واجهة java.lang.clonable نفسها ، وإلا سيتم طرح clonenotsupportedException .
2. دور الاستنساخ ()
ملاحظة: تشير الكائنات هنا على وجه التحديد إلى أنواع معقدة.
1. بسيط = العملية
نحن نعلم أن كائنات الأنواع المعقدة في Java كلها أنواع مرجعية ، وغالبًا ما تقوم بتخزين عناوين الذاكرة للكائنات. لذلك ، لا يمكننا ببساطة تعيين عملية القيمة باعتبارها = المشغل. نقوم بتعيين كائن A إلى كائن آخر B ، ونحن ببساطة نخصص عنوان ذاكرة الكائن A إلى B بحيث يشير كلاهما إلى عنوان الذاكرة نفسه. نتيجة ذلك هي أن التعديلات على أحد الكائنات ستؤثر على الكائن الآخر. يظهر الشكل التالي:
PRING P1 = شخص جديد () ؛ الشخص p2 = p1 ؛
2. استنساخ ()
باستخدام طريقة clone () ، يمكنك إنشاء نسخة من كائن بسرعة ، ويشير الكائنان إلى عناوين ذاكرة مختلفة. يظهر الشكل التالي:
PRISE P1 = شخص جديد () ؛ person p2 = p1.clone () ؛
3. استنساخ ضحل وعمق استنساخ ، استنساخ ضحل (نسخة ضحلة)
يشير استنساخ الضحل إلى الحقول في كائن الاستنساخ نفسه ، وليس كائن الاستنساخ. فقط استدعاء super.clone () ، فقط استنساخ ضحل. على الرغم من أن الكائن المنسوخ يشير إلى عناوين ذاكرة مختلفة ، إلا أن الحقول في الكائن لا تزال تشير إلى عنوان الذاكرة نفسه مثل الكائن السابق.
الطبقة العامة الضحلة تنفذ اسم {اسم السلسلة العامة ؛ العصر العام العام ؛ الشخص العام ؛ public algarclone () {} public aldalowclone (اسم السلسلة ، int age ، الشخص الشخص) {this.name = name ؛ this.age = العمر ؛ this.person = شخص ؛ } Override public algarclone clone () {alghalowclone c = null ؛ حاول {c = (alganowclone) super.clone () ؛ العودة ج. } catch (clonenotsupportedException e) {E.PrintStackTrace () ؛ } return c ؛ } public static void main (string [] args) {person p = new person () ؛ p.name = "p" ؛ p.age = 10 ؛ ضحلة C1 = ضحلة جديدة ("جيم" ، 18 ، ص) ؛ System.out.printf ("قبل clone: c1 = ٪ s ، c1.person = ٪ s/n" ، c1 ، c1.person) ؛ alganowclone c2 = c1.clone () ؛ System.out.printf ("بعد استنساخ: c2 = ٪ s ، c2.person = ٪ s/n" ، c2 ، c2.person) ؛ }}تشغيل Main () الإخراج:
قبل استنساخ: c1 = cre.sample.test.object.shallowclone@558385e3 ، c1.person = cre.sample.test.person@2dcb25f1after clone: c2 = cre.samed.test.oBject.shallowclone@742808b3 ،
وبهذه الطريقة ، تغير عنوان ذاكرة الكائن الضحل ، لكن عنوان ذاكرة حقل الشخص في الكائن لم يتغير ؛
2. استنساخ عميق (نسخة عميقة)
يشير الاستنساخ العميق إلى الحقول في كائن الاستنساخ نفسه وأيضًا كائن الاستنساخ.
/*** مثال رمز استنساخ عميق* تم إنشاؤه بواسطة Cregu في 2016/6/9. */الطبقة العامة DeepClone تنفذ clonable {public string name ؛ العصر العام العام ؛ الشخص العام ؛ public deepclone () {} public deepclone (اسم السلسلة ، int age ، الشخص الشخص) {this.name = name ؛ this.age = العمر ؛ this.person = شخص ؛ } Override public deepclone clone () {deepclone c = null ؛ حاول {c = (deepclone) super.clone () ؛ c.person = person.clone () ؛ العودة ج. } catch (clonenotsupportedException e) {E.PrintStackTrace () ؛ } return c ؛ } public static void main (string [] args) {person p = new person () ؛ p.name = "p" ؛ p.age = 10 ؛ DeepClone C1 = New DeepClone ("Jim" ، 18 ، P) ؛ System.out.printf ("قبل clone: c1 = ٪ s ، c1.person = ٪ s/n" ، c1 ، c1.person) ؛ deepclone c2 = c1.clone () ؛ System.out.printf ("بعد استنساخ: c2 = ٪ s ، c2.person = ٪ s/n" ، c2 ، c2.person) ؛ }}تشغيل Main () الإخراج:
قبل استنساخ: c1 = cre.sample.test.object.deepclone@558385e3 ، c1.person = cre.sample.test.person@2dcb25f1after clone: c2 = cre.samed.test.object.deepclone@742808b3 ،
في هذه الحالة ، تغير عنوان ذاكرة كائن DeepClone ، لكن عنوان ذاكرة حقل الشخص في الكائن قد تغير أيضًا.
التحليل الشامل أعلاه لطريقة استنساخ كائن Java هو كل المحتوى الذي أشاركه معك. آمل أن تتمكن من إعطائك مرجعًا وآمل أن تتمكن من دعم wulin.com أكثر.