Java知识点

本文介绍了Java中对象拷贝的两种方式:浅拷贝和深拷贝。浅拷贝仅复制对象的引用,导致原对象和新对象属性变化同步。而深拷贝则创建了对象所有属性的新副本,即使原对象改变,新对象的属性也不会受影响。示例代码展示了如何通过构造器和重写`clone()`方法实现深拷贝。
摘要由CSDN通过智能技术生成

一、浅拷贝与深拷贝

1. 浅拷贝

  • 新对象只是拷贝了原对象的地址值,原对象的任何属性发生变化,新对象的值的属性就会变化
package com.erick.copy;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;

public class Demo01 {
    public static void main(String[] args) {
        User firstUser = new User("erick", "shanxi");
        /*浅克隆*/
        User secondUser = firstUser;

        /*相同地址值*/
        System.out.println(firstUser);
        System.out.println(secondUser);

        /*前面引用改变了属性,后面的也会发生变化*/
        firstUser.setAddress("haha");

        System.out.println(secondUser.getAddress());
    }
}

@Getter
@Setter
@AllArgsConstructor
class User {
    private String name;
    private String address;
}

2. 深拷贝

  • 新对象拷贝了原对象的所有的值,即使原对象的属性发生变化,新对象值的属性也不会变化
  • 包含以下几种拷贝方式

2.1 构造器

  • 用构造器来new多个不同的对象,保证属性一致即可
  • 对象数量少的时候可以采取这种方式
  • 对象数量多的时候,开销很大

2.2 clone方法

  • 只能clone基本数据类型和String,不能clone引用类型的成员变量
  • 引用类型的成员变量,克隆的时候还是浅克隆
package com.erick.copy;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;

public class Demo02 {
    public static void main(String[] args) {
        try {
            Student first = new Student("erick", "shanxi");
            Student second = first.clone();

            /*克隆的对象是完全不同的,引用地址不同,但是里面的属性完全一致*/
            System.out.println(first==second);
            System.out.println(second.getName());

            first.setAddress("BEIJING");
            System.out.println(second.getAddress());

        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
    }
}

@Getter
@Setter
@AllArgsConstructor
/*1. 具体对象,实现Cloneable,
  2. 重写clone方法*/
class Student implements Cloneable {
    private String name;
    private String address;


    @Override
    public Student clone() throws CloneNotSupportedException {
        Student student = (Student) super.clone();
        return student;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值