Java中的浅拷贝与深拷贝
1。浅拷贝含义:
对于基本类型来讲都是值的引用,但是对于引用类型来讲,拷贝的是同一个引用,也就是同一个首地址的对象,它所指的堆内存都是一样的。
2。深拷贝含义:
对于基本类型来讲都是值的引用,但是对于引用类型来讲,会再创建一个新的对象,指向另一个首地址。
班级类拷贝方法为浅拷贝
公共类类实现可克隆{
/*
-
<李>
学生
*/
私人学生学生;
/
班级名称
*/私人字符串classesName;
/班级编号
/
私人字符串classesCode;
公共类(classesName学生学生,字符串,字符串classesCode) {
超级();
。学生=学生;
。classesName=classesName;
。classesCode=classesCode;
}
公共学生getStudent () {
返回学生;
}
公共空setStudent(学生学生){
。学生=学生;
}
公共字符串getClassesName () {
返回classesName;
}
公共空setClassesName(字符串classesName) {
。classesName=classesName;
}
公共字符串getClassesCode () {
返回classesCode;
}
公共空setClassesCode(字符串classesCode) {
。classesCode=classesCode;
}
公共对象克隆()抛出CloneNotSupportedException {
返回super.clone ();
}
}
/* *
-
<李>学生类李>
<李> @author赢得10 李>
<李>
/
公共类学生实现可克隆{
/
-
<李>姓名
*/
私人字符串名称;李>
/*
-
<李>年龄
*/
私人int年龄;李>
公共学生(字符串名称,int年龄){
超级();
this.name=名字;
。年龄=年龄;
}
公共字符串getName () {
返回名称;
}
公共空setName(字符串名称){
this.name=名字;
}
公共int getAge () {
返回年龄;
}
公共空setAge (int年龄){
。年龄=年龄;
}
}
测试类:
公共类TestClone {
公共静态void main (String [] args) {
学生stu=新学生(“张三“,16);
类cla=new类(斯图,“初一(2)班“,“002“);
System.out.println(“原对象:“+ cla);
System.out.println(“原对象学生属性“+ stu);
System.out.println(“姓名:“+ cla.getStudent () . getname() +“年龄:“+ cla.getStudent () .getAge ());
尝试{cla2=
类(类)cla.clone ();
//重新设置拷贝对象学生的年龄属性,用于观察是否会影响到原对象的学生年龄属性
cla2.getStudent () .setAge (18);
System.out.println(“拷贝对象:“+ cla2);
System.out.println(“拷贝对象学生属性:“+ cla2.getStudent ());
System.out.println(“拷贝对象姓名:“+ cla2.getStudent () . getname() +“年龄:“+ cla2.getStudent () .getAge ());
System.out.println(“原对象姓名:“+ cla.getStudent () . getname() +“年龄:“+ cla.getStudent () .getAge ());
}捕捉(CloneNotSupportedException e) {
e.printStackTrace ();
}
}
}
测试结果:
虽然类对象已经是深拷贝,但是类对象里的学生对象并没有做到深拷贝。拷贝出来的类对象的学生属性会跟随着原类的学生的变化而变化同样的原类的学生也会跟着拷贝后的学生变化后变化。
改版后的代码:
包克隆;
/* *
-
<李>班级类李>
<李> @author赢得10 李>
<李>
/
公共类类实现可克隆{
/
-
<李>学生
*/
私人学生学生;李>
/
班级名称
*/私人字符串classesName;
/班级编号
/
私人字符串classesCode;
公共类(classesName学生学生,字符串,字符串classesCode) {
超级();
。学生=学生;
。classesName=classesName;
。classesCode=classesCode;
}
公共学生getStudent () {
返回学生;
}
公共空setStudent(学生学生){
。学生=学生;
}
公共字符串getClassesName () {
返回classesName;
}
公共空setClassesName(字符串classesName) {
。classesName=classesName;
}
公共字符串getClassesCode () {
返回classesCode;
}
公共空setClassesCode(字符串classesCode) {