在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
字段也会受到影响。