千家信息网

Java中的浅拷贝与深拷贝

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,Java中的浅拷贝与深拷贝1.浅拷贝含义:对于基本类型来讲都是值的引用,但是对于引用类型来讲,拷贝的是同一个引用,也就是同一个首地址的对象,它所指的堆内存都是一样的。2.深拷贝含义:对于基本类型来讲都
千家信息网最后更新 2026年11月02日Java中的浅拷贝与深拷贝

Java中的浅拷贝与深拷贝

1.浅拷贝含义:
对于基本类型来讲都是值的引用,但是对于引用类型来讲,拷贝的是同一个引用,也就是同一个首地址的对象,它所指的堆内存都是一样的。
2.深拷贝含义:
对于基本类型来讲都是值的引用,但是对于引用类型来讲,会再创建一个新的对象,指向另一个首地址。

班级类拷贝方法为浅拷贝
public class Classes implements Cloneable{
/*

  • 学生
    */
    private Student student;

    /
    班级名称
    */
    private String classesName;

    /班级编号
    /
    private String classesCode;

    public Classes(Student student, String classesName, String classesCode) {
    super();
    this.student = student;
    this.classesName = classesName;
    this.classesCode = classesCode;
    }

    public Student getStudent() {
    return student;
    }

    public void setStudent(Student student) {
    this.student = student;
    }

    public String getClassesName() {
    return classesName;
    }

    public void setClassesName(String classesName) {
    this.classesName = classesName;
    }

    public String getClassesCode() {
    return classesCode;
    }

    public void setClassesCode(String classesCode) {
    this.classesCode = classesCode;
    }

    public Object clone() throws CloneNotSupportedException {
    return super.clone();
    }
    }

/**

  • 学生类
  • @author win 10
  • /
    public class Student implements Cloneable{
    /

    • 姓名
      */
      private String name;

    /*

    • 年龄
      */
      private int age;

    public Student(String name, int age) {
    super();
    this.name = name;
    this.age = age;
    }

    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 class TestClone {
public static void main(String[] args) {
Student stu = new Student("张三",16);
Classes cla = new Classes(stu,"初一(2)班","002");
System.out.println("原对象:"+cla);
System.out.println("原对象student属性"+stu);
System.out.println("姓名:"+cla.getStudent().getName()+"年龄:"+cla.getStudent().getAge());
try {
Classes cla2 = (Classes)cla.clone();
//重新设置拷贝对象student的年龄属性,用于观察是否会影响到原对象的student年龄属性
cla2.getStudent().setAge(18);
System.out.println("拷贝对象:"+cla2);
System.out.println("拷贝对象student属性:"+cla2.getStudent());
System.out.println("拷贝对象姓名:"+cla2.getStudent().getName()+"年龄:"+cla2.getStudent().getAge());
System.out.println("原对象姓名:"+cla.getStudent().getName()+"年龄:"+cla.getStudent().getAge());
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
}
}
测试结果:

虽然Classes对象已经是深拷贝,但是Classes对象里的Student对象并没有做到深拷贝。拷贝出来的Classes对象的Student属性会跟随着原Classes的Student的变化而变化同样的原Classes的Student也会跟着拷贝后的Student变化后变化。

改版后的代码:
package Clone;

/**

  • 班级类
  • @author win 10
  • /
    public class Classes implements Cloneable{
    /

    • 学生
      */
      private Student student;

    /
    班级名称
    */
    private String classesName;

    /班级编号
    /
    private String classesCode;

    public Classes(Student student, String classesName, String classesCode) {
    super();
    this.student = student;
    this.classesName = classesName;
    this.classesCode = classesCode;
    }

    public Student getStudent() {
    return student;
    }

    public void setStudent(Student student) {
    this.student = student;
    }

    public String getClassesName() {
    return classesName;
    }

    public void setClassesName(String classesName) {
    this.classesName = classesName;
    }

    public String getClassesCode() {
    return classesCode;
    }

    public void setClassesCode(String classesCode) {
    this.classesCode = classesCode;
    }

    public Object clone() throws CloneNotSupportedException {
    Classes cla = (Classes)super.clone();
    cla.student = (Student)student.clone();
    return cla;
    }
    }
    将Stundent引用类型也做一个深拷贝

package Clone;

/**

  • 学生类
  • @author win 10
  • /
    public class Student implements Cloneable{
    /

    • 姓名
      */
      private String name;

    /年龄
    /
    private int age;

    public Student(String name, int age) {
    super();
    this.name = name;
    this.age = age;
    }

    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 Object clone() throws CloneNotSupportedException {
    return super.clone();
    }
    }
    Student也加上拷贝方法
    测试结果:

更多技术分享,请关注微信公众号 Big Data课堂

拷贝 对象 年龄 班级 姓名 属性 类型 学生 变化 测试 名称 含义 地址 方法 结果 也就是 代码 公众 内存 所指 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 瑰夏咖啡 上海喔噻互联网科技有限公司 中国互联网科技股 互联网科技革命 互联网科技视频 深圳艾佳互联网科技 欧洲十大科技互联网公司 贵州叶脉互联网科技有限公司所属行业 语蝶互联网科技有限公司 互联网科技大奖都有哪些公司 长沙茂晟互联网科技有限公司 特约风豹互联网科技为什么扣费 区块链结合互联网科技 科技互联网海报 济南小医互联网科技有限公司招聘 上海同邻互联网科技有限公司规模 江苏互联网智能科技产品出厂价 求路客互联网科技电话 第三届互联网大会安防黑科技 青岛互联网科技园 深圳科技互联网 互联网科技论坛 深圳互联网科技怎么样 西藏七维空间互联网科技有限公司 新华互联网科技2019 成都互联网科技公司工作好不好 互联网方面的科技前沿 广州互联网高科技取餐柜 昆明中奇联合互联网科技 互联网科技企业商标注意事项
0