溫馨提示×

java clone方法的默認實現(xiàn)是什么

小樊
84
2024-10-16 00:00:56
欄目: 編程語言

在Java中,clone()方法是Object類的一個protected方法,它的默認實現(xiàn)是淺拷貝(shallow copy)。這意味著它只復(fù)制對象本身和對象中的基本數(shù)據(jù)類型(如int、float等),而不會遞歸地復(fù)制對象內(nèi)部的其他對象。如果對象內(nèi)部還有引用類型字段,那么這些字段的值仍然是原來對象的引用,而不是新對象的引用。

對于實現(xiàn)Cloneable接口的類,可以通過重寫clone()方法來實現(xiàn)深拷貝(deep copy)。深拷貝會遞歸地復(fù)制對象內(nèi)部的所有對象,新對象和原對象在內(nèi)存中是完全獨立的。

以下是一個簡單的示例,說明clone()方法的默認實現(xiàn):

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類都實現(xiàn)了Cloneable接口,并重寫了clone()方法。然而,由于clone()方法的默認實現(xiàn)是淺拷貝,所以person1person2address字段指向的是同一個Address對象。當我們修改person1address字段時,person2address字段也會受到影響。

0