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