كيفية نسخ كائن بشكل صحيح في Java: النسخ السطحي والعميق
مرحباً بالجميع! لقد بدأت للتو في تعلم Java وواجهت مشكلة تحيرني كثيراً. أحاول نسخ كائن لكني أحصل على نتائج غير متوقعة. لنفترض أن لدي كلاس بسيط Person مع حقول name و age، بالإضافة إلى كائن Address متداخل.
عندما أكتب:
```java
Person p1 = new Person("إيفان", 30, new Address("موسكو", "تفيرسكايا", 10));
Person p2 = p1;
p2.setName("بيتر");
System.out.println(p1.getName()); // يطبع "بيتر" - لماذا؟!
```
كنت أتوقع أن يبقى p1 "إيفان"، ويصبح p2 "بيتر". لكن كما فهمت، هذا مجرد نسخ للمرجع. جربت استخدام method clone():
```java
public class Person implements Cloneable {
private String name;
private Address address;
// constructor, getters, setters
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
```
لكن عندما قمت باستنساخ الكائن وغيرت العنوان في النسخة، تغير العنوان في الأصل أيضاً. قرأت أن هذا يسمى