1. نسخة ضحلة ومفهوم نسخة عميقة
⑴shally نسخة (استنساخ ضحل)
تحتوي جميع متغيرات الكائن النسخ على نفس قيمة الكائن الأصلي ، في حين أن جميع الإشارات إلى الكائنات الأخرى لا تزال تشير إلى الكائن الأصلي. وبعبارة أخرى ، فإن النسخ الضحل ببساطة ينسخ الكائن الذي يتم النظر فيه ، وليس الكائن الذي يشير إليه.
⑵ نسخة عميقة (استنساخ عميق)
تحتوي جميع متغيرات الكائن المنسوخ على نفس قيمة الكائن الأصلي ، باستثناء تلك المتغيرات التي تشير إلى كائنات أخرى. ستشير تلك المتغيرات التي تشير إلى كائنات أخرى إلى كائن جديد نسخته ، بدلاً من الكائنات المرجعية الأصلية. بمعنى آخر ، نسخ نسخة عميقة جميع الكائنات المشار إليها بواسطة الكائن المراد نسخه.
2. طريقة استنساخ Java ()
⑴ تقوم طريقة Clone بنسخ نسخة من الكائن وإعادتها إلى المتصل. بشكل عام ، ترضي طريقة Clone ():
① لأي كائن x ، هناك x.clone ()! = x // الكائن المستنسخ ليس هو نفس الكائن مثل الكائن الأصلي ② لأي كائن x ، هناك x.clone (). getClass () = = x .
⑵clone من الأشياء في جافا
① من أجل الحصول على نسخة من الكائن ، يمكننا استخدام طريقة clone () لفئة الكائن.
② الكتابة فوق طريقة clone () للفئة الأساسية في الفئة المشتقة وأعلن أنها عامة.
③ في طريقة clone () للفئة المشتقة ، استدعاء super.clone ().
④ تنفيذ الواجهة المستنسخة في الفئة المشتقة.
يرجى الاطلاع على الرمز التالي:
الطالب العام ينفذ {string age ؛ الطالب) super.clone () ؛ // clone () في الكائن يتعرف على الكائن الذي تريد نسخه. } catch (clonenotsupportedException e) {system.out.println (e.toString () ؛ S2 = (الطالب) S1.Clone () ؛ System.out.println ("name ="+s1.name+"،"+"Age ="+s1.age) ؛ +S2.age) ؛ يوضح:
① لماذا يتعين علينا الاتصال بـ super.clone () عند الكتابة فوق طريقة استنساخ الكائن () في الفئة المشتقة؟ في وقت التشغيل ، يتعرف Clone () في الكائن الذي تريد نسخه ، ثم يخصص مساحة لهذا الكائن ، ونسخ الكائن ، ونسخ محتويات الكائن الأصلي واحدًا تلو الآخر في مساحة التخزين للكائن الجديد.
② طريقة clone () الموروثة من فئة java.lang.object هي نسخة ضحلة. الرمز التالي يمكن أن يثبت ذلك.
PROSSERSS {string age ؛ int age ؛ الطالب (int age ، professort p) {this.name = name ؛ .clone () ؛ ) "؛ s2.p.age = 30 ؛ system.out.println (" name = "+s1.p.name+" ، "+" age = "+s1.p.age) ؛ system.out.println (" name = "+s2.p.name+" ، "+" Age = "+S2.P.AGE) ؛ // تصبح نتائج إخراج أساتذة الطلاب 1 و 2 ليزى ، والعصر 30. }} فكيف يجب أن ننفذ الاستنساخ العميق ، أي أن الأستاذ الذي يعدل S2 لن يؤثر على الأستاذ الذي S1؟ تم تحسين الرمز على النحو التالي.
تحسينات لجعل أستاذ الطالب 1 دون تغيير (استنساخ عميق)
أستاذ الفئة clonable {string age ؛ Clone () ؛ int age ، p) {this.name = name ؛ } catch (clonenotsupportedException e) {system.out.println (E.ToString () ؛ args) "ليز" ؛ System.out.println ("name ="+s1.p.name+"،"+"Age ="+s1.p.age) ؛ "+" Age = "+s2.p.age) ؛}} 3. استخدم التسلسل للقيام بنسخة عميقة (بشكل أساسي لتجنب إعادة كتابة طريقة clone () للنسخة العميقة من الكائنات الأكثر تعقيدًا ، ويمكن أيضًا تنفيذ الإرسال المستمر نقطة التوقف والوظائف الأخرى)
عملية كتابة الكائنات في التدفقات هي عملية تسلسل ، لكنها تسمى بشكل واضح "مجمدة" أو "اختيار" في أدوات مبرمجي Java ؛ عملية.
تجدر الإشارة إلى أن ما هو مكتوب في الدفق هو نسخة من الكائن ، ولا يزال الكائن الأصلي موجودًا في JVM ، لذا فإن ما هو "المخلل في المخللات" هو مجرد نسخة من الكائن ، ولا يزال Java Pickles لا يزال بإمكان Java Pickles كن جديدًا.
يمكن أن يجعل نسخ كائن بلغة Java بعمق الكائن تطبيق الواجهة القابلة للتسلسل أولاً ، ثم اكتب الكائن (في الواقع مجرد نسخة من الكائن) إلى دفق (مخلل في المخللات) ، ثم قراءته من الدفق (وضع الدفق (وضع يمكن للمخللات الظهر) إعادة بناء الكائن.
فيما يلي رمز مصدر النسخ العميق.
كائن عام deepclone () {// اكتب الكائن في الدفق bytearrayouttream = جديد bytearrayoutmstream () ؛ bo.tobyearray () ؛ الفرضية من ذلك هي أن الكائن وجميع الكائنات المرجعية داخل الكائن قابلة للتسلسل. . الخارج. تم تحسين رمز المثال أعلاه على النحو التالي.
معلم الفصل العمر ؛ طالب باطل عام (اسم سلسلة ، المعلم t) {this.name = name. انتقل إلى BYTEARRAYOUTTHERE New ObjectInputStream (BI) ؛ 18 ، الطالب S2 = (الطالب) name = "+s1.t.name+" ، "+" Age = "+s1.t.age) ؛}}