clone()
method in the parent Object class is protected, so overriding it with the declaration as public is required. It returns an instance of the object with copied primitive fields and links. And it turns out that the original and its clone of the reference field indicate the same objects. The example below shows how the field at the original object and the clone simultaneously changes. public class CloneTest{ static class Person implements Cloneable{ String name; int age; Car car; Person(Car car,int age,String name) { this.car = car; this.age = age; this.name = name; } @Override public String toString() { return this.name+" {" + "age=" + age + ", car=" + car + '}'; } @Override protected Object clone() throws CloneNotSupportedException { return super.clone(); } } static class Car{ public String color; Car(String color) { this.color = color; } @Override public String toString() { return "{" + "color car='" + color + '\'' + '}'; } } public static void main(String[] args) throws CloneNotSupportedException { Car car = new Car("Green"); Person person=new Person(car,25,"Mike"); Person clone = (Person) person.clone(); System.out.println(person); System.out.println(clone); clone.name=new String("Ivan"); clone.car.color="red"; System.out.println(person); System.out.println(clone); } } : Mike {age=25, car={color car='Green'}} Mike {age=25, car={color car='Green'}} Mike {age=25, car={color car='red'}} Ivan {age=25, car={color car='red'}}
public class Person { private int age; private String name; public Person(int age, String name){ this.age=age; this.name=name; } // public Person(Person other) { this(other.getAge(), other.getName()); } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "Person{" + "age=" + age + ", name='" + name + '\'' + '}'; } public static void main(String[] args) { Person original = new Person(18, "Grishka"); Person clone = new Person(original); System.out.println(original); System.out.println(clone); } } : Person{age=18, name='Grishka'} Person{age=18, name='Grishka'}
import java.io.*; class Cat implements Serializable{ private String name; private String color; private int age; public Cat(String name, String color, int age) { this.name = name; this.color = color; this.age = age; } public String getColor() { return color; } public void setColor(String color) { this.color = color; } @Override public String toString() { return "Cat{" + "name='" + name + '\'' + ", color='" + color + '\'' + ", age=" + age + '}'; } } public class BasketCats{ public static void main(String[] args) throws IOException, ClassNotFoundException { Cat vaska = new Cat("Vaska","Gray",4); ByteArrayOutputStream baos = new ByteArrayOutputStream(); ObjectOutputStream ous = new ObjectOutputStream(baos); // () ous.writeObject(vaska); ous.close(); ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); ObjectInputStream ois = new ObjectInputStream(bais); // Cat cloneVaska = (Cat)ois.readObject(); System.out.println(vaska); System.out.println(cloneVaska); System.out.println("*********************************************"); cloneVaska.setColor("Black"); // , System.out.println(vaska); System.out.println(cloneVaska); } } : Cat{name='Vaska', color='Gray', age=4} Cat{name='Vaska', color='Gray', age=4} ********************************************* Cat{name='Vaska', color='Gray', age=4} Cat{name='Vaska', color='Black', age=4}
Source: https://habr.com/ru/post/246993/
All Articles