JAVA对象clone方法代码实例解析

JAVA对象clone方法代码实例解析

什么是clone方法

在Java中,Object类的clone()方法用于创建并返回当前对象的一个复制。对象复制即将一个对象的值赋给另一个对象,新对象与原有对象相互独立,新对象修改不会对原有对象造成影响。

clone方法的使用

通过clone方法复制对象,需要满足以下两个条件:

  1. 实现Cloneable接口。
  2. 重写Object类的clone()方法。

当需要复制一个对象时,必须先将该对象的类实现Cloneable接口,否则在调用clone()方法时会抛出CloneNotSupportedException异常。

接下来,重写Object类的clone()方法。Object类中clone()方法的修饰符为protected,子类可以继承该方法,但是需要重写其方法体。因为Object类的clone()方法是浅复制的,即将对象的引用复制一份。若该对象是一个可变的类,复制出来的对象与原有对象共享引用,修改一个对象会影响到另一个对象。

clone方法代码实例

下面是一个实现clone方法的Java类:

public class Person implements Cloneable {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // 重写clone()方法
    @Override
    public Object clone() {
        try {
            return (Person) super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
            return null;
        }
    }

    // getter和setter方法
    public String getName() {
        return this.name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return this.age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

在上述代码中,实现了Person类,并且实现了Cloneable接口并重写了clone()方法。接下来,可以使用clone()方法复制Person对象,并对对象进行修改,以证明两个对象互相独立。示例代码如下:

public static void main(String[] args) {
    Person person1 = new Person("Tom", 20);
    Person person2 = (Person) person1.clone();

    System.out.println("person1 == person2:" + (person1 == person2));
    System.out.println("person1.getName() == person2.getName():" + (person1.getName() == person2.getName()));
    System.out.println("person1.getAge() == person2.getAge():" + (person1.getAge() == person2.getAge()));

    person2.setName("Ken");
    person2.setAge(23);

    System.out.println("person1 :" + person1.getName() + " " + person1.getAge());
    System.out.println("person2 :" + person2.getName() + " " + person2.getAge());
}

输出结果为:

person1 == person2:false
person1.getName() == person2.getName():true
person1.getAge() == person2.getAge():true
person1 :Tom 20
person2 :Ken 23

从输出结果可以看出,虽然person1和person2不是同一个对象,但是person1的name和age的引用与person2相同。但是修改person2的name和age后,并不会影响person1中的值。

接下来,再来演示一下没有实现Cloneable接口的类无法使用clone()方法的实例:

public class Animal {
    private String name;

    public Animal(String name) {
        this.name = name;
    }

    // 未实现Cloneable接口
    @Override
    public Object clone() {
        try {
            return super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
            return null;
        }
    }

    public String getName() {
        return this.name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

在上述代码中,实现了Animal类,并且重写了clone()方法。但是,由于没有实现Cloneable接口,所以当使用clone()方法复制对象时,会抛出CloneNotSupportedException异常。下面演示代码:

public static void main(String[] args) {
    Animal animal1 = new Animal("Tom");
    // 未实现Cloneable接口,会抛出CloneNotSupportedException异常
    Animal animal2 = (Animal) animal1.clone();
}

输出结果为:

java.lang.CloneNotSupportedException
    at Animal.clone(Animal.java:11)
    at Test.main(Test.java:10)

从错误提示可以看出,因为Animal类没有实现Cloneable接口,所以会抛出CloneNotSupportedException异常。

总结

Java中的clone()方法是用于复制对象的方法,需要先实现Cloneable接口并重写Object类的clone()方法。使用clone()方法复制出来的对象与原有对象相互独立,修改一个对象不会影响到另一个对象。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JAVA对象clone方法代码实例解析 - Python技术站

(0)
上一篇 2023年6月26日
下一篇 2023年6月26日

相关文章

  • linux学习日记十二 磁盘配额(quota)

    下面是《Linux学习日记十二 磁盘配额(quota)》的完整攻略。 什么是磁盘配额(quota) 磁盘配额(quota)是一种机制,它可以限制用户在文件系统中可以使用的空间大小,以避免磁盘被某个用户的文件占满。 配置磁盘配额 在Linux系统中,使用磁盘配额需要安装quota软件包。以Debian/Ubuntu系统为例,使用以下命令安装quota: sud…

    other 2023年6月28日
    00
  • SERV-U 的配置文件详解

    SERV-U 的配置文件详解 背景 SERV-U是一款FTP服务器软件,其配置文件是控制Server的行为的核心文件,包括用户、密码、访问权限等内容。因此理解SERV-U的配置文件是极其必要的。 配置文件介绍 SERV-U的配置文件是单一的INIR文件格式,其路径为: \Serv-U\domain\FTPServer.ini 配置文件的结构类似于Window…

    other 2023年6月25日
    00
  • Win8自定义个性锁屏壁纸就是Win键+L锁屏时的画面

    Win8自定义个性锁屏壁纸需要以下步骤: 1. 准备壁纸图片 首先要准备一张符合个人喜好的图片作为锁屏壁纸,可以通过搜索引擎或者自己拍摄获取。请注意,图片需要满足以下规范: 建议大小为1920 x 1080像素; 不得包含色情、暴力、政治等敏感内容; 图片格式只支持JPG、JPEG、GIF、BMP、PNG格式。 2. 修改注册表 打开运行对话框,按下Win+…

    other 2023年6月25日
    00
  • 积累linux常用命令大全

    下面我来详细讲解关于“积累Linux常用命令大全”的完整攻略。 1. 收集常用命令 首先,我们需要收集常用的命令。可以通过以下途径收集: 通过搜索引擎搜索“linux 常用命令”,找到一些常用命令的列表。比如 https://www.cnblogs.com/peida/archive/2012/12/05/2807227.html 把自己平时常用的命令整理出…

    other 2023年6月26日
    00
  • Kotlin类的继承实现详细介绍

    Kotlin类的继承实现详细介绍 在 Kotlin 中,类的继承通过 : ParentClass() 这种方式实现,其中 ParentClass 表示父类名。 基本继承 一个子类继承于单个父类: // 定义一个父类 open class ParentClass { open fun printMessage() { println("这是父类的信息…

    other 2023年6月26日
    00
  • Android虚拟机与类加载机制详情

    Android虚拟机与类加载机制 什么是Android虚拟机 Android虚拟机是为了在计算机上模拟Android系统环境,方便开发者开发和测试安卓应用程序的工具。目前Android系统所用的虚拟机主要是Dalvik和ART两种。 Dalvik虚拟机 Dalvik虚拟机是Google在Android系统中使用的Java虚拟机,它使用了一种叫做DEX的字节码…

    other 2023年6月25日
    00
  • linux下进入root用户登录

    Linux下进入root用户登录 在Linux下,root用户是系统管理员,拥有最高权限。在进行一些敏感操作时,我们需要登录到root账户进行操作。 以下是进入root用户登录的步骤: 步骤一:使用普通用户登录系统 首先,我们需要使用一个普通用户登录到系统。通过这个用户,我们可以执行一些和普通用户相关的操作。 步骤二:切换到root用户 在登录到普通用户后,…

    其他 2023年3月28日
    00
  • thinkphp如何实现伪静态

    当然,我很乐意为您提供有关“ThinkPHP如何实现伪静态”的完整攻略。以下是详细的步骤和两个示例: 1. 什么是伪静态? 伪静态是指将动态生成的URL转换为静态的URL,以便更好地优化搜索引擎的索引和用户的访问体验。在ThinkPHP中,我们可以通过URL重写来实现伪静态。 2. ThinkPHP如何实现伪静态? 以下是两种实现ThinkPHP伪静态的方法…

    other 2023年5月6日
    00
合作推广
合作推广
分享本页
返回顶部