Java知识点

一、浅拷贝与深拷贝

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;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值