在Java中,clone()
方法是Object
類的一個protected方法,它的默認實現是淺拷貝(shallow copy)。這意味著它只復制對象本身和對象中的基本數據類型(如int、float等),而不會遞歸地復制對象內部的其他對象。如果對象內部還有引用類型字段,那么這些字段的值仍然是原來對象的引用,而不是新對象的引用。
對于實現Cloneable
接口的類,可以通過重寫clone()
方法來實現深拷貝(deep copy)。深拷貝會遞歸地復制對象內部的所有對象,新對象和原對象在內存中是完全獨立的。
以下是一個簡單的示例,說明clone()
方法的默認實現:
class Person implements Cloneable {
String name;
int age;
Address address;
public Person(String name, int age, Address address) {
this.name = name;
this.age = age;
this.address = address;
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
class Address implements Cloneable {
String street;
String city;
public Address(String street, String city) {
this.street = street;
this.city = city;
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
public class Main {
public static void main(String[] args) throws CloneNotSupportedException {
Person person1 = new Person("Alice", 30, new Address("123 Main St", "New York"));
Person person2 = (Person) person1.clone();
System.out.println(person1.name); // Alice
System.out.println(person2.name); // Alice
person1.address.street = "456 Elm St";
System.out.println(person1.address.street); // 456 Elm St
System.out.println(person2.address.street); // 123 Main St
}
}
在這個示例中,Person
類和Address
類都實現了Cloneable
接口,并重寫了clone()
方法。然而,由于clone()
方法的默認實現是淺拷貝,所以person1
和person2
的address
字段指向的是同一個Address
對象。當我們修改person1
的address
字段時,person2
的address
字段也會受到影響。