Junior
167
Какво знаеш за повърхностното копиране?
Отговор от AI
sobes.tech AI
Повърхностното копиране (shallow copy) създава ново копие на обекта, но не копира обектите, към които се отнасят полетата на оригиналния обект. Вместо това, се копират само референциите.
Характеристики:
- Промените в променяемите обекти, към които се отнасят копията, ще бъдат видими в оригиналния обект и обратно.
- По-бързо е от дълбокото копиране за обекти с много референции.
Реализира се например чрез метода clone() (ако обектът реализира Cloneable) или ръчно.
Пример за clone():
// Създаваме клас с променливо поле
class Address {
String city;
public Address(String city) {
this.city = city;
}
@Override
public String toString() {
return "Address{" +
"city='" + city + '\'' +
'}';
}
}
// Създаваме клас с препратка към Address, който реализира Cloneable
class Person implements Cloneable {
String name;
Address address;
public Person(String name, Address address) {
this.name = name;
this.address = address;
}
// Реализираме повърхностно копиране чрез Object.clone()
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", address=" + address +
'}';
}
}
// Пример за използване
public class ShallowCopyExample {
public static void main(String[] args) throws CloneNotSupportedException {
Address originalAddress = new Address("New York");
Person originalPerson = new Person("Alice", originalAddress);
// Повърхностно копиране
Person copiedPerson = (Person) originalPerson.clone();
System.out.println("Оригинален човек: " + originalPerson);
System.out.println("Копиран човек: " + copiedPerson);
// Модифицираме променяемото поле в вложения обект на оригинала...
originalAddress.city = "Los Angeles";
// ...промените са видими и в копието, тъй като и двете сочат към един и същи Address обект
System.out.println("\nСлед промяна на оригиналния адрес:");
System.out.println("Оригинален човек: " + originalPerson);
System.out.println("Копиран човек: " + copiedPerson);
}
}
Използва се, когато не е необходимо да се дублира цялата йерархия от обекти, или когато вложените обекти са неизменяеми.