Java中常用API总结(5)—— Object类中的深克隆和浅克隆

简介: 不管对象内部的属性是基本数据类型还是引用数据类型,都完全拷贝过来;基本数据类型拷贝过来的是具体的数据,引用数据类型拷贝过来的是地址值。在Object类中默认的克隆方式就是浅克隆

一、前言


本文将详细讲述Object类中的对象克隆方法,其中包含深克隆和浅克隆,两者有一定区别;在本文中也会有具体的实例说明来验证两者之间的区别,构建的例子也会一步一步讲述


二、浅克隆


1.概述


不管对象内部的属性是基本数据类型还是引用数据类型,都完全拷贝过来;基本数据类型拷贝过来的是具体的数据,引用数据类型拷贝过来的是地址值。在Object类中默认的克隆方式就是浅克隆


4c58eb088d054af3861ac3917d9f01b6.png


2.实例


1️⃣思路


  • 这里我们首先要定义一个Student类,并设计一些私有的属性:name,sex,age,以及一个数组用来表示该学生的成绩,然后使用Javabean插件一键生成Javabean


  • 接着定义arrToString()方法将表示成绩的字符串变成字符串形式,方法体内的代码可以通过查看源码后复制黏贴


  • 最重要的是重写clone方法并且要继承cloneable接口


  • 注意test类要抛出异常 (只需要Alt+Enter快捷键自动处理爆红处即可)


2️⃣继承cloneable接口底层原理


  • 快捷键Ctrl+N搜索clone后选择java.long包下的


113404151f8e437ab8371ed96d84efdd.png


  • 这里可以看到他是一个接口,所有我们在写Student类的时候要继承接口,即要写上implements Cloneable


af14e181cf2f4bca95920ca3d2ad1404.png


3️⃣重写clone方法底层原理


  • 快捷键Ctrl+N搜索clone后选择java.long包下的


86f872277833421891b5b78e6b8c08ee.png


  • 选中obj后再使用快捷键Ctrl+F12搜索clone


55ec4d26dcd148ec82b74ee587542dec.png


  • 可以看到clone方法是protected修饰的,是受保护的,使用这个方法我们必须要重写他,所以在IDEA上直接打clone会自动跳出重写的方法


8f81e68f80254d34adeb996b2224bdee.png


3.代码实现


import java.util.StringJoiner;
public class Student implements Cloneable{
    private String name;
    private String sex;
    private int age;
    private int[] score;
    public Student() {
    }
    public Student(String name, String sex, int age, int[] score) {
        this.name = name;
        this.sex = sex;
        this.age = age;
        this.score = score;
    }
    /**
     * 获取
     * @return name
     */
    public String getName() {
        return name;
    }
    /**
     * 设置
     * @param name
     */
    public void setName(String name) {
        this.name = name;
    }
    /**
     * 获取
     * @return sex
     */
    public String getSex() {
        return sex;
    }
    /**
     * 设置
     * @param sex
     */
    public void setSex(String sex) {
        this.sex = sex;
    }
    /**
     * 获取
     * @return age
     */
    public int getAge() {
        return age;
    }
    /**
     * 设置
     * @param age
     */
    public void setAge(int age) {
        this.age = age;
    }
    /**
     * 获取
     * @return score
     */
    public int[] getScore() {
        return score;
    }
    /**
     * 设置
     * @param score
     */
    public void setScore(int[] score) {
        this.score = score;
    }
    public String toString() {
        return "Student{name = " + name + ", sex = " + sex + ", age = " + age + ", score = " +  arrToString();
    }
    public String arrToString() {
        StringJoiner sj = new StringJoiner(", ", "[", "]");
        for (int i = 0; i < score.length; i++) {
            sj.add(score[i] + "");
        }
        return sj.toString();
    }
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}
package TestArrCopy;
public class Test {
    public static void main(String[] args) throws CloneNotSupportedException {
        int[] score = {96,84,79,88,91,80,73};
        Student s1 = new Student("张三","男",20,score);
        Student s2 = (Student)s1.clone();
        System.out.println(s1);
        System.out.println(s2);
    }
}


Student{name = 张三, sex = 男, age = 20, score = [96, 84, 79, 88, 91, 80, 73]
Student{name = 张三, sex = 男, age = 20, score = [96, 84, 79, 88, 91, 80, 73]

965fc4dc5d384434af84d22f2faf6da7.png


三、深克隆


1.概述


基本数据类型拷贝过来,字符串复用,引用数据类型会重新创建新的


78bfe146244941a88f6e6b46cde74aad.png


2.实例


一般要使用第三方工具才能实现深克隆,这里就简单的介绍一下使用第三方工具实现深克隆的步骤:1️⃣将第三方写的代码导入项目中(jar包)2️⃣编写代码:将对象变为字符串后再变为对象输出即可


3.代码实现


Gson gson = new Gson();
String s3 = gson.toJson(u1)
User u = gson.fromJson(s3, Student,class);
System.out.println(u);


四、结语


接下来将讲述Object类相关知识点以及一些常用方法

相关文章
|
20小时前
|
SQL Java API
Java一分钟之-JPA:Java持久化API简介
【5月更文挑战第14天】Java Persistence API (JPA) 是Java的ORM规范,用于简化数据库操作。常见问题包括实体映射、事务管理和性能问题。避免错误的关键在于明确主键策略、妥善使用事务、优化查询及理解实体生命周期。示例展示了如何定义实体和使用`EntityManager`保存数据。JPA通过标准化API让开发者更专注于业务逻辑,提升开发效率和代码维护性。
10 0
|
20小时前
|
安全 Java 开发者
Java一分钟之-文件与目录操作:Path与Files类
【5月更文挑战第13天】Java 7 引入`java.nio.file`包,`Path`和`Files`类提供文件和目录操作。`Path`表示路径,不可变。`Files`包含静态方法,支持创建、删除、读写文件和目录。常见问题包括:忽略异常处理、路径解析错误和权限问题。在使用时,注意异常处理、正确格式化路径和考虑权限,以保证代码稳定和安全。结合具体需求,这些方法将使文件操作更高效。
11 2
|
20小时前
|
Java API
Java一分钟之-Java日期与时间API:LocalDate, LocalDateTime
【5月更文挑战第13天】Java 8引入`java.time`包,改进日期时间API。`LocalDate`代表日期,`LocalDateTime`包含日期和时间。本文概述两者的基本用法、常见问题及解决策略。创建日期时间使用`of()`和`parse()`,操作日期时间有`plusDays()`、`minusMonths()`等。注意点包括:设置正确的`DateTimeFormatter`,考虑闰年影响,以及在需要时区信息时使用`ZonedDateTime`。正确使用这些类能提升代码质量。
10 3
|
20小时前
|
安全 Java 开发者
Java一分钟之-Optional类:优雅处理null值
【5月更文挑战第13天】Java 8的`Optional`类旨在减少`NullPointerException`,提供优雅的空值处理。本文介绍`Optional`的基本用法、创建、常见操作,以及如何避免错误,如直接调用`get()`、误用`if (optional != null)`检查和过度使用`Optional`。正确使用`Optional`能提高代码可读性和健壮性,建议结合实际场景灵活应用。
17 3
|
20小时前
|
Java API 数据处理
Java一分钟之-Stream API:数据处理新方式
【5月更文挑战第13天】Java 8的Stream API为集合操作提供了声明式编程,简化数据处理。本文介绍了Stream的基本概念、常见问题和易错点。问题包括并行流与顺序流的区别,状态改变操作的影响,以及忘记调用终止操作和误用`peek()`。理解并合理使用Stream API能提升代码效率和可维护性。实践中不断探索,将发掘更多Stream API的潜力。
11 3
|
20小时前
|
存储 Java ice
【Java开发指南 | 第十六篇】Java数组及Arrays类
【Java开发指南 | 第十六篇】Java数组及Arrays类
8 3
|
20小时前
|
Java 编译器 ice
【Java开发指南 | 第十五篇】Java Character 类、String 类
【Java开发指南 | 第十五篇】Java Character 类、String 类
13 1
|
20小时前
|
存储 Java ice
【Java开发指南 | 第十四篇】Java Number类及Math类
【Java开发指南 | 第十四篇】Java Number类及Math类
10 1
|
20小时前
|
存储 缓存 Java
【Java开发指南 | 第六篇】Java成员变量(实例变量)、 类变量(静态变量)
【Java开发指南 | 第六篇】Java成员变量(实例变量)、 类变量(静态变量)
9 2
|
20小时前
|
Java 编译器
【Java开发指南 | 第一篇】类、对象基础概念及Java特征
【Java开发指南 | 第一篇】类、对象基础概念及Java特征
9 4

热门文章

最新文章