请举例说明什么叫做“只会拷贝对象的基本数据类型和引用,而不会拷贝对象中引用的其他对象“
时间: 2024-03-01 22:53:20 浏览: 9
假设有如下的代码:
```
public class Person implements Cloneable {
private String name;
private Address address;
public Person(String name, Address address) {
this.name = name;
this.address = address;
}
public String getName() {
return name;
}
public Address getAddress() {
return address;
}
@Override
public Person clone() throws CloneNotSupportedException {
return (Person) super.clone();
}
}
public class Address {
private String city;
private String street;
public Address(String city, String street) {
this.city = city;
this.street = street;
}
public String getCity() {
return city;
}
public String getStreet() {
return street;
}
}
public class Main {
public static void main(String[] args) throws CloneNotSupportedException {
Address address = new Address("北京", "朝阳区");
Person person1 = new Person("小明", address);
Person person2 = person1.clone();
System.out.println(person1 == person2); // false,不是同一个对象
System.out.println(person1.getAddress() == person2.getAddress()); // true,引用类型的成员变量引用的是同一个对象
}
}
```
在上面的代码中,Person 类包含一个 Address 类型的成员变量 address,Address 类包含两个 String 类型的成员变量 city 和 street。在 Main 类的 main 方法中,我们创建了一个 Person 对象 person1,其中的 address 引用一个 Address 对象,然后我们使用 `clone()` 方法创建了一个 person2 对象,并比较了 person1 和 person2 是否是同一个对象,以及 person1 和 person2 的 address 是否是同一个对象。
运行该程序会输出以下内容:
```
false
true
```
可以看到,person1 和 person2 不是同一个对象,但是 person1 和 person2 的 address 引用的是同一个对象。这说明使用 `super.clone()` 方法创建对象的副本时,只会拷贝对象的基本数据类型和引用,而不会拷贝对象中引用的其他对象(在这个例子中就是 Address 对象)。因此,如果需要深拷贝一个对象(包括对象中引用的其他对象),需要在 clone() 方法中实现拷贝逻辑。