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

yizhihongxing

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日

相关文章

  • Java详解线上内存暴涨问题定位和解决方案

    Java详解线上内存暴涨问题定位和解决方案攻略 背景 在 Java 应用程序中,内存使用是一个关键的方面。随着应用程序的运行,内存使用可能会不断增加,这可能会导致内存暴涨问题。内存暴涨问题对应用程序的性能产生非常大的影响,甚至会导致应用程序中止运行。定位和解决内存暴涨问题需要一定的技巧和经验。本文将详解如何定位和解决 Java 应用程序中的内存暴涨问题。 定…

    other 2023年6月26日
    00
  • 基于jquery的简单富文本编辑器

    基于jQuery的简单富文本编辑器 随着Web应用程序的发展,越来越多的用户希望能够在网页中直接进行富文本编辑。市面上有许多优秀的开源富文本编辑器,其中使用最广泛的是基于JavaScript的开源富文本编辑器。在这里,我们将介绍一个基于jQuery的简单富文本编辑器。 使用jQuery构建富文本编辑器 jQuery是一个功能强大、使用方便、兼容性良好的Jav…

    其他 2023年3月28日
    00
  • Win10一周年更新RTM正式版本号猜测 或定为14400?

    根据题目所提到的“Win10一周年更新RTM正式版本号猜测 或定为14400?”,以下是一个详细的攻略: 首先,了解Win10一周年更新的背景信息。Win10一周年更新是指Windows 10操作系统在发布一年后的重要更新。这种更新通常会引入新功能、修复漏洞和改进性能。 研究以往的Windows版本号模式。过去的Windows版本号通常遵循一定的规律,例如W…

    other 2023年8月2日
    00
  • vlanif和vlan路由

    vlanif和vlan路由 在网络设备配置中,VLAN是一个非常重要的概念,它可以帮助我们更好地管理和控制网络流量。而在VLAN配置中,VLAN接口(vlanif)和VLAN路由也是两个非常重要的组成部分。在本文中,我们将详细介绍vlanif和vlan路由的概念、配置和使用。 vlanif vlanif是VLAN虚拟接口的缩写,用于将网络上的不同设备划分为不…

    其他 2023年3月28日
    00
  • 基于Docker+Jenkins实现自动化部署的方法

    下面是基于Docker+Jenkins实现自动化部署的完整攻略。 1. 简介 Docker是一个开源的容器化平台,Jenkins是一个流行的自动化构建工具。二者组合在一起可以构建一个完整的自动化部署方案,加快软件开发、测试和部署的速度,提高工作效率。 2. 准备工作 在使用Docker和Jenkins进行自动化部署之前需要进行以下准备工作: 安装Docker…

    other 2023年6月27日
    00
  • iOS 分类和继承

    下面是“iOS 分类和继承的完整攻略”的详细讲解,包括分类和继承的概念、使用方法、示例说明等方面。 分类和继承的概念 在iOS开发中,分类和继承是两种常用的代码复用方式。 分类是指在已有类的基础上,添加一些新的方法或属性,以扩展原有类的功能。分类可以在不修改原有类的情况下,为其添加新的功能。 继承是指创建一个新的类,该类继承了已有类的属性和方法,并可以添加新…

    other 2023年5月5日
    00
  • C++空类默认函数详细解析

    C++空类默认函数详细解析 什么是空类 空类是指在C++中没有成员变量和成员函数的类。例如: class EmptyClass { }; 空类默认函数 空类虽然没有成员变量和成员函数,但它依然会存在一些默认的函数。下面我们分别来详细讲解这些默认函数。 默认构造函数 空类默认拥有一个默认构造函数,它可以被省略不写。默认构造函数的函数体为一个空语句。 以下是一个…

    other 2023年6月26日
    00
  • matlab的null函数

    MATLAB的null函数 MATLAB的null函数用于计算矩阵的零空间。零空间是指矩阵的所有零特征值对应的特征向量所张成的空间。在线性数中,零空间也称为核。 语法 N = null(A) N = null(A, ‘r’) 参数- A:输入矩阵。 ‘r’:可选参数,表示计算矩阵的右零空间。 返回值 N:矩阵A零空间或右零空间的基。 示例1:计算矩阵的零空间…

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