English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
هذا克隆() تستخدم لإنشاء نسخة من كائن تم تنفيذه من قبل فئةطريقة Cloneable واجهة.نسخ حسب الحقل، بسبب عدم معرفة فئة Object عن أعضاء الكائنات الخاصة بالفئات التي تستدعي هذه الطريقة لا يعلم عنها أي شيء. لذلك، إذا كانت الفئة تحتوي فقط على أعضاء أنواع البيانات الأساسية، فإنها ستقوم بإنشاء نسخة جديدة من الكائن وتقوم بإرجاع مرجع إلى نسخة الكائن الجديدة. ولكن، إذا كانت الفئة تحتوي على أي أعضاء من أنواع الكائنات، فإنها تقوم فقط بالنسخ من مراجع الأعضاء لتلك الأعضاء، لذا فإن مراجع الأعضاء في الكائن الأصلي والكائن المكرر تشير إلى نفس الكائن.
إذا حاولت تنفيذCloneable عند استدعاء الكائن من الفئة في واجهةclone()الطريقة، فإنه سيتم الحصول عليهاCloneNotSupportedException . إن واجهةالواجهة العلامة،وذلكالواجهةالتنفيذ يمثل فقط أنه يمكن استدعاء الطريقة على كائن الفئة المطبقةObject.clone()الطريقة.
protected Object clone() throws CloneNotSupportedException
يمكننا من خلالclone()
يتم تنفيذ الطريقة这两种方式
إذا كان لهذه الفئة أيضًا أعضاء غير أصلية، فإن هذاObject.clone()نتيجة ميزة النسخ الافتراضي التي يقدمها الطريقة. في حالة "نسخ ضحل"، يظل الكائن المكرر يشير إلى نفس الكائن الذي يشير إليه الكائن الأصلي، لأنه يتم نسخ استدلالات الكائن فقط وليس الكائن نفسه.
public class ShallowCopyTest { public static void main(String args[]) { A a1 = new A(); A a2 = (A) a1.clone(); a1.sb.append("w3codebox!"); System.out.println(a1); System.out.println(a2); } } class A implements Cloneable { public StringBuffer sb = new StringBuffer("Welcome to "); public String toString() { return sb.toString(); } public Object clone() { try { return super.clone(); } catch (CloneNotSupportedException e) { } return null; } }
نتائج الإخراج
مرحبًا بك في w3codebox! مرحبًا بك في w3codebox!
للأنواع الأعضاء غير الأصلية للفئات، نحتاج إلى كتابةclone() يتم تنفيذنسخ متعمق،لأنه يحتاج أيضًا إلى نسخ الأعضاء المُ克隆ة، ولم يتمكن النظام الأساسي للنسخ الافتراضي من القيام بذلك.
public class DeepCopyTest { public static void main(String args[]) { A a1 = new A(); A a2 = (A) a1.clone(); a1.sb.append(" w3codebox!"); System.out.println(a1); System.out.println(a2); } } class A implements Cloneable { public StringBuffer sb = new StringBuffer("Welcome to "); public String toString() { return sb.toString(); } public Object clone() { try { A a = (A) super.clone(); a.sb = new StringBuffer(sb.toString()); return a; } catch (CloneNotSupportedException e) { } return null; } }
نتائج الإخراج
مرحبًا بك في w3codebox! مرحبًا بك في