通过Object的clone方法实现浅拷贝,通过实现cloneable接口实现拷贝。
public class Address {
public String city;
public Address(String city) {
this.city = city;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
@Override
public String toString() {
return "Address{" +
"city='" + city + '\'' +
'}';
}
}
public class Student implements Cloneable {
private String name;
private int age;
private Address address;
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public Student(String name, int age, Address address) {
this.name = name;
this.age = age;
this.address = address;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
@Override
public Object clone() {
Student student = null;
try {
student = (Student) super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return student;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
", address=" + address +
'}';
}
}
public class Test{
public void testClone2() {
Student student01 = new Student();
Address address = new Address("上海");
student01.setName("xiaoming");
student01.setAge(20);
student01.setAddress(address);
Student student02 = (Student) student01.clone();
//验证是否创建了一个对象
System.out.println(student01 == student02);
System.out.println(student01);
System.out.println(student02);
//验证是否为拷贝类型,深拷贝或者浅拷贝
student02.setAge(22);
student02.setName("xiaowang");
address.setCity("南京");
student01.setAddress(address);
System.out.println(student01);
System.out.println(student02);
}
}
false
Student{name='xiaoming', age=20, address=Address{city='上海'}}
Student{name='xiaoming', age=20, address=Address{city='上海'}}
Student{name='xiaoming', age=20, address=Address{city='南京'}}
Student{name='xiaowang', age=22, address=Address{city='南京'}}
public class Address implements Cloneable {
public String city;
public Address(String city) {
this.city = city;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
@Override
public Object clone() {
Address address = null;
try {
address = (Address) super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return address;
}
@Override
public String toString() {
return "Address{" +
"city='" + city + '\'' +
'}';
}
}
public class Student implements Cloneable {
private String name;
private int age;
private Address address;
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public Student(String name, int age, Address address) {
this.name = name;
this.age = age;
this.address = address;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
@Override
public Object clone() {
Student student = null;
try {
student = (Student) super.clone();
student.address = (Address) address.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return student;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
", address=" + address +
'}';
}
}
public class Test{
public void testClone2() {
Student student01 = new Student();
Address address = new Address("上海");
student01.setName("xiaoming");
student01.setAge(20);
student01.setAddress(address);
Student student02 = (Student) student01.clone();
//验证是否创建了一个对象
System.out.println(student01 == student02);
System.out.println(student01);
System.out.println(student02);
//验证是否为拷贝类型,深拷贝或者浅拷贝
student02.setAge(22);
student02.setName("xiaowang");
address.setCity("南京");
student01.setAddress(address);
System.out.println(student01);
System.out.println(student02);
}
}
false
Student{name='xiaoming', age=20, address=Address{city='上海'}}
Student{name='xiaoming', age=20, address=Address{city='上海'}}
Student{name='xiaoming', age=20, address=Address{city='南京'}}
Student{name='xiaowang', age=22, address=Address{city='上海'}}