用jiava举例强引拷贝和强拷贝的区别
时间: 2024-04-30 12:19:18 浏览: 7
首先需要明确一下,Java中通常所说的"浅拷贝"就是我们所说的"强拷贝",而Java中没有直接的"强引用拷贝"的概念。
下面用Java代码举例说明强拷贝和浅拷贝的区别:
```java
class Person implements Cloneable {
private String name;
private int age;
private Address address;
// 构造函数
public Person(String name, int age, Address address) {
this.name = name;
this.age = age;
this.address = address;
}
// 重写Object类的clone方法
@Override
protected Object clone() throws CloneNotSupportedException {
Person person = (Person) super.clone();
person.address = (Address) address.clone();
return person;
}
}
class Address implements Cloneable {
private String province;
private String city;
// 构造函数
public Address(String province, String city) {
this.province = province;
this.city = city;
}
// 重写Object类的clone方法
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
public class Test {
public static void main(String[] args) throws CloneNotSupportedException {
Address address = new Address("Guangdong", "Shenzhen");
Person person1 = new Person("Tom", 20, address);
// 强拷贝
Person person2 = (Person) person1.clone();
System.out.println(person1 == person2); // false
System.out.println(person1.getAddress() == person2.getAddress()); // false
// 浅拷贝
Person person3 = new Person(person1.getName(), person1.getAge(), person1.getAddress());
System.out.println(person1 == person3); // false
System.out.println(person1.getAddress() == person3.getAddress()); // true
}
}
```
在上面的代码中,我们定义了一个`Person`类和一个`Address`类。`Person`类中包含了一个`Address`类的对象作为成员变量。我们在`Person`类中重写了`clone()`方法,实现了深拷贝。`Address`类也重写了`clone()`方法,但是只是实现了浅拷贝。
在`Test`类中,我们分别使用强拷贝和浅拷贝的方式创建了新的`Person`对象。我们可以看到,使用强拷贝方式创建的新对象和原对象不是同一个对象,且新对象中的`Address`对象也不是原对象中`Address`对象的引用。而使用浅拷贝方式创建的新对象和原对象不是同一个对象,但是新对象中的`Address`对象是原对象中`Address`对象的引用。
因此,通过上述代码示例,我们可以看到强拷贝和浅拷贝的区别。强拷贝会创建一个新的对象,并且新对象中的引用类型成员变量所引用的对象也会被复制一份,两个对象完全独立;而浅拷贝只是复制了对象的值,对象中的引用类型成员变量所引用的对象并没有被复制,新对象和原对象中的引用类型成员变量引用的是同一个对象。