English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

أهمية طريقة clone() في Java؟

هذا克隆() تستخدم لإنشاء نسخة من كائن تم تنفيذه من قبل فئةطريقة 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!
مرحبًا بك في