Рубрики

Clone () метод в Java

Клонирование объекта относится к созданию точной копии объекта. Он создает новый экземпляр класса текущего объекта и инициализирует все его поля точно содержимым соответствующих полей этого объекта.

Использование оператора присваивания для создания копии ссылочной переменной
В Java нет оператора для создания копии объекта. В отличие от C ++, в Java, если мы используем оператор присваивания, он создаст копию ссылочной переменной, а не объекта. Это можно объяснить на примере. Следующая программа демонстрирует то же самое.

// Java-программа для демонстрации этого назначения
// оператор только создает новую ссылку на то же
// объект.

import java.io.*;

  
// Тестовый класс, чьи объекты клонированы

class Test

{

    int x, y;

    Test()

    {

        x = 10;

        y = 20;

    }

}

  
// Класс водителя

class Main

{

    public static void main(String[] args)

    {

         Test ob1 = new Test();

  

         System.out.println(ob1.x + " " + ob1.y);

  

         // Создание новой ссылочной переменной ob2

         // указываем на тот же адрес, что и ob1

         Test ob2 = ob1;

  

         // Любые изменения, сделанные в ob2, будут отражены

         // в ob1

         ob2.x = 100;

  

         System.out.println(ob1.x+" "+ob1.y);

         System.out.println(ob2.x+" "+ob2.y);

    }

}

Выход:

10 20
100 20
100 20

Создание копии с использованием метода clone ()

Класс, чья копия объекта должна быть сделана, должен иметь открытый метод клонирования в нем или в одном из его родительских классов.

  • Каждый класс, который реализует clone (), должен вызывать super.clone () для получения ссылки на клонированный объект.
  • Класс также должен реализовывать интерфейс java.lang.Cloneable, чей объект-клон мы хотим создать, в противном случае он вызовет исключение CloneNotSupportedException при вызове метода clone для объекта этого класса.
  • Синтаксис:
      protected Object clone() throws CloneNotSupportedException

Использование метода clone () -Shallow Copy

// Java-программа для демонстрации мелкой копии
// используя clone ()

import java.util.ArrayList;

  
// Ссылка на объект этого класса
// содержится в Test2

class Test

{

    int x, y;

}

  
// Содержит ссылку на Test и реализует
// клон с мелкой копией.

class Test2 implements Cloneable

{

    int a;

    int b;

    Test c = new Test();

    public Object clone() throws

                   CloneNotSupportedException

    {

        return super.clone();

    }

}

  
// Класс водителя

public class Main

{

    public static void main(String args[]) throws

                          CloneNotSupportedException

    {

       Test2 t1 = new Test2();

       t1.a = 10;

       t1.b = 20;

       t1.c.x = 30;

       t1.c.y = 40;

  

       Test2 t2 = (Test2)t1.clone();

  

       // Создание копии объекта t1 и передача

       // это к t2

       t2.a = 100;

  

       // Изменять примитивный тип t2 не буду

       // отражаться в поле t1

       t2.c.x = 300;

  

       // Изменение в поле типа объекта будет

       // отражается как в t2, так и в t1 (мелкая копия)

       System.out.println(t1.a + " " + t1.b + " " +

                          t1.c.x + " " + t1.c.y);

       System.out.println(t2.a + " " + t2.b + " " +

                          t2.c.x + " " + t2.c.y);

    }

}

Выход:

10 20 300 40
100 20 300 40

В приведенном выше примере t1.clone возвращает поверхностную копию объекта t1. Для получения глубокой копии объекта необходимо выполнить определенные модификации в методе клонирования после получения копии.

Глубокая копия против мелкой копии

  • Мелкая копия — это метод копирования объекта, который по умолчанию используется при клонировании. В этом методе поля старого объекта X копируются в новый объект Y. При копировании поля типа объекта ссылка копируется в Y, т. Е. Объект Y будет указывать на то же местоположение, на которое указывает X. Если значение поля является тип примитива копирует значение типа примитива.
  • Поэтому любые изменения, сделанные в ссылочных объектах в объекте X или Y, будут отражены в другом объекте.

Мелкие копии дешевы и просты в изготовлении. В приведенном выше примере мы создали мелкую копию объекта.

Использование метода clone () — Deep Copy

  • Если мы хотим создать глубокую копию объекта X и поместить ее в новый объект Y, то создается новая копия любых полей объектов, на которые есть ссылки, и эти ссылки помещаются в объект Y. Это означает, что любые изменения, сделанные в полях объекта, на которые есть ссылки, в объекте X или Y будет отражаться только в этом объекте, а не в другом. В приведенном ниже примере мы создаем глубокую копию объекта.
  • Глубокая копия копирует все поля и создает копии динамически распределенной памяти, на которую указывают поля. Глубокое копирование происходит, когда объект копируется вместе с объектами, на которые он ссылается.

// Java-программа для демонстрации глубокой копии
// используя clone ()

import java.util.ArrayList;

  
// Ссылка на объект этого класса
// содержится в Test2

class Test

{

    int x, y;

}

  

  
// Содержит ссылку на Test и реализует
// клон с глубокой копией.

class Test2 implements Cloneable

{

    int a, b;

  

    Test c = new Test();

  

    public Object clone() throws

                CloneNotSupportedException

    {

        // Назначаем мелкую копию новой ссылочной переменной t

        Test2 t = (Test2)super.clone();

  

        t.c = new Test();

  

        // Создать новый объект для поля c

        // и назначить его полученной копии,

        // сделать глубокую копию

        return t;

    }

}

  

public class Main

{

    public static void main(String args[]) throws

                             CloneNotSupportedException

    {

       Test2 t1 = new Test2();

       t1.a = 10;

       t1.b = 20;

       t1.c.x = 30;

       t1.c.y = 40;

  

       Test2 t3 = (Test2)t1.clone();

       t3.a = 100;

  

       // Изменять примитивный тип t2 не буду

       // отражаться в поле t1

       t3.c.x = 300;

  

       // Изменения в поле типа объекта t2 не будет

       // отражаться в t1 (глубокая копия)

       System.out.println(t1.a + " " + t1.b + " " +

                          t1.c.x + " " + t1.c.y);

       System.out.println(t3.a + " " + t3.b + " " +

                          t3.c.x + " " + t3.c.y);

    }

}

Выход:

10 20 30 40
100 20 300 0

В приведенном выше примере мы видим, что для объекта-копии был назначен новый объект класса Test, который будет возвращен в методе clone. Благодаря этому t3 получит глубокую копию объекта t1. Таким образом, любые изменения, сделанные в полях объекта 'c' к t3, не будут отражены в t1.

Преимущества метода клонирования:

  • Если мы используем оператор присваивания для назначения ссылки на объект другой ссылочной переменной, то это будет указывать на то же адресное местоположение старого объекта, и новая копия объекта не будет создана. В связи с этим любые изменения в ссылочной переменной будут отражены в исходном объекте.
  • Если мы используем конструктор копирования, то мы должны явно скопировать все данные, т.е. мы должны явно переназначить все поля класса в конструкторе. Но в методе клонирования эта работа по созданию новой копии выполняется самим методом. Чтобы избежать дополнительной обработки, мы используем клонирование объектов.

Эта статья предоставлена Анкит Агарвал. Если вам нравится GeeksforGeeks и вы хотите внести свой вклад, вы также можете написать статью и отправить ее по почте на contrib@geeksforgeeks.org. Смотрите свою статью, появляющуюся на главной странице GeeksforGeeks, и помогите другим вундеркиндам.

Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по обсуждаемой теме

Рекомендуемые посты:

Clone () метод в Java

0.00 (0%) 0 votes