Метод Java Object clone () создает неглубокую копию объекта.
Здесь мелкая копия означает, что она создает новый объект и копирует все поля и методы, связанные с объектом.
Синтаксис clone()
метода:
object.clone()
clone () Параметры
clone()
Метод не принимает никаких параметров.
clone () Возвращаемые значения
- возвращает копию объекта
- выбрасывает,
CloneNotSupportedException
если класс объекта не реализуетCloneable
интерфейс
Примечание : Object
класс не реализует Cloneable
. Следовательно, мы не можем вызвать clone()
метод для объекта Object
класса.
Пример 1: Java clone ()
class Main implements Cloneable ( // declare variables String name; int version; public static void main(String() args) ( // create an object of Main class Main obj1 = new Main(); // initialize name and version using obj1 obj1.name = "Java"; obj1.version = 14; // print variable System.out.println(obj1.name); // Java System.out.println(obj1.version); // 14 try ( // create clone of obj1 Main obj2 = (Main)obj1.clone(); // print the variables using obj2 System.out.println(obj2.name); // Java System.out.println(obj2.version); // 14 ) catch (Exception e) ( System.out.println(e); ) ) )
В приведенном выше примере мы создали класс с именем Main. Класс включает два поля: имя и версия. Здесь мы инициализировали поля класса, используя объект класса obj1.
Обратите внимание на линию,
Main obj2 = (Main)obj1.clone();
Здесь мы использовали этот clone()
метод для создания копии obj1. Возвращаемое значение clone()
присваивается объекту obj2. Поскольку возвращаемое значение clone()
is Object
type, мы использовали его (Main)
для преобразования в тип Main.
Теперь к имени и версии полей можно получить доступ с помощью объекта obj2. Однако, если мы изменим значение полей с помощью obj2, значение, связанное с obj1, не изменится.
Пример 2: изменение значения с помощью клонированного объекта
class Main implements Cloneable ( // declare variables String name; int version; public static void main(String() args) ( // create an object of Main class Main obj1 = new Main(); // initialize name and version using obj1 obj1.name = "Java"; obj1.version = 14; // print variable System.out.println(obj1.name); // Java System.out.println(obj1.version); // 14 try ( // create a clone of obj1 Main obj2 = (Main)obj1.clone(); // print the variables using obj2 System.out.println(obj2.name); // Java System.out.println(obj2.version); // 14 // changing value of name // using obj2 obj2.name = "Python"; System.out.println(obj2.name); // Python // check if value associated // with obj1 is changed System.out.println(obj1.name); // Java ) catch (Exception e) ( System.out.println(e); ) ) )
Обратите внимание на линию,
obj2.name = "Python";
Здесь мы изменили значение переменной с помощью obj2. Теперь, когда мы печатаем имя переменной для obj1 и obj2, мы видим, что значение для obj1 не изменилось. Это потому, что clone()
метод делает мелкую копию объектов.
Чтобы узнать больше о мелком копировании, посетите Что такое мелкое копирование в Java?
Мы заключили clone()
метод в блок Java try… catch. Это потому, что подкласс может вызвать исключение, если объект не может быть клонирован.
Примечание . Object
Класс является суперклассом для всех классов в Java. Следовательно, каждый класс и массивы могут реализовать clone()
метод.