浅复制:
package CloneMethod;
public class ShallowCopy {
public static void main(String[] args) throws CloneNotSupportedException {
Student s=new Student("s",12);
Teacher t=new Teacher("t",40,s);
Teacher ct=(Teacher) t.clone();
System.out.println(ct);
System.out.println("-------------------------------");
// 被复制的bean的属性改变不能引起复制对象的改变
t.setName("copy t");
System.out.println(t);
System.out.println(ct);
System.out.println("-------------------------------");
// 复制后的bean的属性改变能引起复制对象的改变
ct.setName("copy t");
System.out.println(ct);
System.out.println("-------------------------------");
// 对象所引用的另一个对象的属性改变(能够)改变复制对象内的引用属性的改变(浅复制与深复制的区别)
s.setName("copy s");
System.out.println(ct);
}
}
class Student{
int age;
String name;
public Student(String name,int age)
{
this.age=age;
this.name=name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "student name:"+name+",age:"+age;
}
}
//复制必须继承Cloneable
class Teacher implements Cloneable{
int age;
String name;
Student s;
public Teacher(String name,int age,Student s)
{
this.age=age;
this.name=name;
this.s=s;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Student getS() {
return s;
}
public void setS(Student s) {
this.s = s;
}
@Override
public String toString() {
return "teacher name:"+name+",age:"+age+"\ninclude:\n"+s;
}
// 讲protected类型改成public类型
@Override
public Object clone() throws CloneNotSupportedException {
// super.clone()只能实现浅复制
Object obj=super.clone();
return obj;
}
}
运行结果:
teacher name:t,age:40
include:
student name:s,age:12
-------------------------------
teacher name:copy t,age:40
include:
student name:s,age:12
teacher name:t,age:40
include:
student name:s,age:12
-------------------------------
teacher name:copy t,age:40
include:
student name:s,age:12
-------------------------------
teacher name:copy t,age:40
include:
student name:copy s,age:12
深复制:
package CloneMethod;
public class DeepCopy {
public static void main(String[] args) throws CloneNotSupportedException {
Student s=new Student("s",12);
Teacher t=new Teacher("t",40,s);
Teacher ct=(Teacher) t.clone();
System.out.println(ct);
System.out.println("-------------------------------");
// 被复制的bean的属性改变不能引起复制对象的改变
t.setName("copy t");
System.out.println(t);
System.out.println(ct);
System.out.println("-------------------------------");
// 复制后的bean的属性改变能引起复制对象的改变
ct.setName("copy t");
System.out.println(ct);
System.out.println("-------------------------------");
// 对象所引用的另一个对象的属性改变(不能够)改变复制对象内的引用属性的改变(浅复制与深复制的区别)
s.setName("copy s");
System.out.println(ct);
}
}
class Student implements Cloneable{
int age;
String name;
public Student(String name,int age)
{
this.age=age;
this.name=name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "student name:"+name+",age:"+age;
}
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
//复制必须继承Cloneable
class Teacher implements Cloneable{
int age;
String name;
Student s;
public Teacher(String name,int age,Student s)
{
this.age=age;
this.name=name;
this.s=s;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Student getS() {
return s;
}
public void setS(Student s) {
this.s = s;
}
@Override
public String toString() {
return "teacher name:"+name+",age:"+age+"\ninclude:\n"+s;
}
// 讲protected类型改成public类型
@Override
public Object clone() throws CloneNotSupportedException {
// super.clone()只能实现浅复制
Object obj=super.clone();
// 该方法实现深复制
Teacher t=(Teacher) obj;
t.setS((Student)t.getS().clone());
return obj;
}
}
运行结果:
teacher name:t,age:40
include:
student name:s,age:12
-------------------------------
teacher name:copy t,age:40
include:
student name:s,age:12
teacher name:t,age:40
include:
student name:s,age:12
-------------------------------
teacher name:copy t,age:40
include:
student name:s,age:12
-------------------------------
teacher name:copy t,age:40
include:
student name:s,age:12