首页 > 编程语言 >Java中的对象克隆

Java中的对象克隆

时间:2024-03-05 23:35:22浏览次数:41  
标签:Java name 对象 Student scores id 克隆

对象克隆

复制一个一模一样的新对象出来

浅克隆

拷贝出的新对象,与原对象中的数据一模一样(引用类型拷贝的只是地址)

深克隆

  • 对象中基本类型的数据直接拷贝。

  • 对象中的字符串数据拷贝的还是地址。

  • 对象中包含的其他对象,不会拷贝地址,会创建新对象

package com.aiit.itcq;

import java.util.Arrays;
import java.util.Objects;

/**
 * 应用程序入口类,演示对象克隆的概念和浅克隆的实现。
 */
public class App {
    /**
     * 主方法,用于运行对象克隆的演示。
     *
     * @param args 命令行参数
     */
    public static void main(String[] args) {
        // 创建原始对象
        Student s1 = new Student("007", "张三", 25, new double[]{85, 90, 85});

        // 打印原始对象信息
        System.out.println(s1.toString());

        try {
            // 使用浅克隆创建新对象
            Student s1_copy = (Student) s1.clone();

            // 打印克隆对象信息
            System.out.println(s1_copy.toString());

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

/**
 * 学生类,实现了Cloneable接口以支持对象克隆。
 */
class Student implements Cloneable {
    private String id;
    private String name;
    private int age;
    private double[] scores;

    /**
     * 无参构造方法
     */
    public Student() {
    }

    /**
     * 带参构造方法,用于初始化学生对象。
     *
     * @param id     学生ID
     * @param name   学生姓名
     * @param age    学生年龄
     * @param scores 学生成绩数组
     */
    public Student(String id, String name, int age, double[] scores) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.scores = scores;
    }

    // 省略getter和setter方法

    /**
     * 重写equals方法,用于比较对象是否相等。
     */
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return age == student.age &&
                Objects.equals(id, student.id) &&
                Objects.equals(name, student.name) &&
                Arrays.equals(scores, student.scores);
    }

    /**
     * 重写hashCode方法,生成对象的哈希码。
     */
    @Override
    public int hashCode() {
        int result = Objects.hash(id, name, age);
        result = 31 * result + Arrays.hashCode(scores);
        return result;
    }

    /**
     * 重写toString方法,生成对象的字符串表示。
     */
    @Override
    public String toString() {
        return "Student{" +
                "id='" + id + '\'' +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", scores=" + Arrays.toString(scores) +
                '}';
    }

    /**
     * 克隆方法,实现浅克隆。
     *
     * @return 新的克隆对象
     * @throws CloneNotSupportedException 如果对象不支持克隆
     */
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }

    /**
     * 克隆方法,实现深克隆。
     *
     * @return 新的深度克隆对象
     * @throws CloneNotSupportedException 如果对象不支持克隆
     */
//    @Override
//    protected Object clone() throws CloneNotSupportedException {
//        Student clonedStudent = (Student) super.clone();
//        clonedStudent.scores = this.scores.clone();  // 深克隆scores数组
//        return clonedStudent;
//    }
}

标签:Java,name,对象,Student,scores,id,克隆
From: https://www.cnblogs.com/itcq1024/p/18055540

相关文章

  • Java进制之间的转换
    进制:我们生活中使用的是十进制计算机中使用的是二进制在Java中的进制的分类?十进制:逢十进一二进制:逢二进一八进制:逢八进一十六进制:逢十六进一10->A11->B12->C13->D14->E15->F在计算机中,数据......
  • Java 源码,反码和补码
    计算机在对数据进行运算的原理?3-2=13+(-2)=1先将3这个十进制,变成二进制的原码形式,然后变成反码形式,最后变成补码形式先将-2这个十进制,变成二进制的原码形式,然后变成反码形式,最后变成补码形式将这两个数二......
  • Java11改进的垃圾回收器
       传统的C/C++等编程语言,需要程序员负责回收已经分配的内存。显示进行垃圾回收是一件比较困难的事情,因为程序员并不总是知道内存应该何时被释放。如果一些分配出去的内存得不及时回收,就会引起系统运行速度下降,甚至导致程序瘫痪,这种现象被称为内存泄漏。总体而言,显示进行垃圾......
  • Java 抽象类与方法:实现安全性与代码重用
    Java内部类简介在Java中,可以嵌套类(即类内部的类),称为内部类。嵌套类的目的是将属于一起的类分组,从而使您的代码更可读和可维护。访问内部类要访问内部类,请创建外部类的对象,然后创建内部类的对象:classOuterClass{intx=10;classInnerClass{inty=5;}......
  • Java集合
    Java集合Java分为单列数据集合和双列数据集合单列数据集合一次存取一个元素双列数据集合一次存取一对元素单列数据集合单列集合的祖宗(Collection)List系列集合:有序(按照添加的顺序存放)、可重复、有索引Set系列集合:无序、不可重复、无索引Collection接口方法其中......
  • Java SPI 到底是什么
    一、Java扩展机制在介绍SPI机制之前,首先要了解Java的扩展机制(Theextensionmechanism)。“扩展机制”指的是一种标准(或规范),通过遵循这种标准,用户可以自定义接口,达到丰富功能的目的。“扩展”的表现形式,就是一组Java包或者Java类。“扩展”就像热拔插设备一样,Java可......
  • Java方法03:方法的重载
    方法的重载1.重载就是一个类中,有相同的函数名称,但形参不同的函数2.放的重载的规则: 2.1方法名称必须相同2.2参数列表必须不同(个数不同、或类型不同、参数列表顺序不同等)。2.3方法的返回类型可以相同也可以不同。2.4仅仅返回......
  • js 数组筛选方法使用整理_JavaScript常用数组元素搜索或过滤
    一、常用方案介绍:如果你想找到在符合特定条件的阵列中的所有项目,使用filter。如果你想检查是否至少有一个项目符合特定的条件,请使用find。如果你想检查一个数组包含一个特定的值,请使用includes。如果要在数组中查找特定项目的索引,请使用indexOf 二、js数组筛选方法......
  • Java方法02:方法的定义和调用
    1.方法的定义1.Java的方法类似于其它语言的函数,是一段用来完成特定功能的代码片段,一般情况下,定义一个方法包含以下语法:1.1方法包含一个方法头和一个方法体。下面是一个方法的所有部分:1.1.1修饰符:修饰符,这是可选的,告诉编译器如何调用该方法。定义了该......
  • Java面向对象
    面向过程&面向对象面向过程:步骤简单清晰,第一步->第二步->....面向过程适合处理一些较为简单的问题面向对象:分类的思维模式面向对象适合处理复杂的问题对于描述复杂的事物,使用面向对象的思维去宏观上把握、整体上分析,使用面向过程的思维去处理围观操作什么是面向......