前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java对象拷贝

Java对象拷贝

作者头像
Java开发者之家
发布2021-06-17 16:57:29
4730
发布2021-06-17 16:57:29
举报
文章被收录于专栏:Java开发者之家Java开发者之家

# Java对象拷贝

  • 分类
    • 浅拷贝:仅仅克隆基本类型变量,而不克隆引用类型的变量
    • 深拷贝:既克隆基本类型变量,也克隆引用类型变量

# 浅拷贝

通过Object的clone方法实现浅拷贝,通过实现cloneable接口实现拷贝。

代码语言:javascript
复制
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 + '\'' +
                '}';
    }
}
代码语言:javascript
复制
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 +
                '}';
    }
}

# 验证

# 验证代码
代码语言:javascript
复制
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);
    }
}
# 验证结果
代码语言:javascript
复制
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='南京'}}

# 深拷贝

代码语言:javascript
复制
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 + '\'' +
                '}';
    }
}
代码语言:javascript
复制
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 +
                '}';
    }
}
# 验证代码
代码语言:javascript
复制
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);
    }
}
代码语言:javascript
复制
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='上海'}}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-09-30 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • # Java对象拷贝
  • # 浅拷贝
  • # 验证
    • # 验证代码
      • # 验证结果
      • # 深拷贝
        • # 验证代码
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档