Java

java clone方法的默认实现是什么

小樊
86
2024-10-16 00:00:56
栏目: 编程语言

在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()方法的默认实现是浅拷贝,所以person1person2address字段指向的是同一个Address对象。当我们修改person1address字段时,person2address字段也会受到影响。

0
看了该问题的人还看了