当前位置: 首页 > news >正文

Clonable接口和拷贝

Hello~小伙伴们!本篇学习Clonable接口与深拷贝,一起往下看吧~(画图水平有限,两张图,,我真的画了巨久,求路过的朋友来个3连~阿阿阿~~~)


目录

1、Clonable接口概念

2、拷贝

2、1浅拷贝

2、2深拷贝


1、Clonable接口概念

Java 中内置了一些很有用的接口, Clonable 就是其中之一。

祖先类Object 中存在一个 clone 方法, 调用这个方法可以创建一个对象的 "拷贝". 但是要想合法调用 clone 方法, 必须要先实现 Clonable 接口, 否则就会抛出 CloneNotSupportedException 异常。

那么具体如何使用Clonable接口呢?

以拷贝为为例来实现Clonable接口吧

2、拷贝

拷贝分为深拷贝和浅拷贝,就是从不同深度上去拷贝一个东西。接下来以拷贝person为例实现代码。注意:拷贝后的东西会占用新内存,也就是两者指向不同空间,互不影响。(该条件是区分是否被拷贝的核心!!!)

2、1浅拷贝

1、先创建Person类与Money类,并实例化两者对象。(以Money类对象是否拷贝来区别深拷贝或浅拷贝)

//Money类
public class Money {public double qianqian=9.9;@Overridepublic String toString() {return "Money{" +"qianqian=" + qianqian +'}';}}

//Person类

public class Person{String name;int age;public Person(String name, int age) {this.name = name;this.age = age;}//在Pweson类中实例化MoneyMoney money = new Money();@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +'}';}
}

2、在测试类中调用Clone方法

调用Clone方法不是那么的随意简单,需要注意四个点

(1)、在需要拷贝的类中重写Object类中的clone方法.

@Override
protected Object clone() throws CloneNotSupportedException {return super.clone();
}

(2)、将被拷贝的对象强转为该对象所属类。

从上面的代码块可以看到 clone 方法的返回类型为Obeject,所以要强转为拷贝对象所属类。

Person person2 =(Person) person1.clone();

(3)、 异常处理。在main方法体前添加throws CloneNotSupportedException。如下

public class Test {public static void main(String[] args) throws CloneNotSupportedException {Person person1 = new Person("zhangsan", 21);Person person2 = (Person) person1.clone();}
}

(4)实现接口,表示此类可被拷贝。

public class Person implements Cloneable {....}

 3、通过person2.money来改变该money的属性的值。

person2.money.qianqian=99.99;

代码结果如图:

 

从结果可以看出,这种克隆方式是浅拷贝,怎么理解呢? 

看图,改变person2.money来改变属性qianqian的值,也影响了person1.money的属性值。说明只只拷贝了Person类,没有拷贝Money类。这样的拷贝方式成为浅拷贝。

那么如何也将Money拷贝呢?

2、2深拷贝

拷贝Money只需要在浅拷贝的基础上修改两个地方

1、在Money类中重写Object类中的clone方法

@Override
protected Object clone() throws CloneNotSupportedException {return super.clone();
}

2、在Person类中重写Object类中的clone方法

@Override
protected Object clone () throws CloneNotSupportedException {Person person2 = (Person) super.clone();person2.money = (Money) this.money.clone();return person2;
}

这里分了两部拷贝,第一步,先拷贝Person。第二步,拷贝Money(this.表当前调用clone方法的对象即person1) 

 整体代码如下:

//Money类
public class Money implements Cloneable{public double qianqian=9.9;@Overridepublic String toString() {return "Money{" +"qianqian=" + qianqian +'}';}@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone();}
}//Person类
public class Person implements Cloneable {String name;int age;public Person(String name, int age) {this.name = name;this.age = age;}Money money = new Money();@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +'}';}@Overrideprotected Object clone () throws CloneNotSupportedException {Person person2 = (Person) super.clone();person2.money = (Money) this.money.clone();return person2;}}//测试类
public class Test {public static void main(String[] args) throws CloneNotSupportedException {Person person1 = new Person("zhangsan", 21);Person person2 = (Person) person1.clone();System.out.println(person1+"有"+person1.money);System.out.println(person2+"有"+person2.money);person2.money.qianqian=99.99;System.out.println("--------------------------------------------------------");System.out.println(person1+"有"+person1.money);System.out.println(person2+"有"+person2.money);}
}

代码结果: 

 加图理解:

本篇类的Clonable接口和深拷贝就学习到这里是不是收获满满呢,如果觉得文章写的不错,留下小红心再走吧。后面一篇学习做图书管理系统!关注我,不要错过哦!~ 

http://www.lryc.cn/news/380084.html

相关文章:

  • 关于小蛋の编程和小蛋编程为同一作者的说明
  • 大数据平台之Spark
  • How to use ModelSim
  • 【专业英语 复习】第8章 Communications and Networks
  • 运行vue3项目相关报错
  • 2024年6月计算机视觉论文推荐:扩散模型、视觉语言模型、视频生成等
  • Centos Stream9 和Centos Stream10的下载网址
  • chrome 录制器及性能分析工具的使用
  • 如何打造稳定、好用的 Android LayoutInspector?
  • C++ Thead互斥量死锁,mutex如何防止死锁---C++11多线程快速学习
  • Ubuntu 之Glade图形化设计器
  • 152. 乘积最大子数组
  • proactor模式
  • Charles抓包工具
  • RabbitMQ如何保证消息可靠
  • 学习笔记——路由网络基础——路由的高级特性
  • 网络编程之XDP、TC和IO_URING以及DPDK
  • 晶谷高温烧结导电浆料用低熔点玻璃粉 晶谷耐高温导电漆导电油墨高温玻璃粉
  • 【Mysql】DQL操作单表、创建数据库、排序、聚合函数、分组、limit关键字
  • Excel 常用技巧(四)
  • 【Linux 基础】文件与目录管理
  • C++系列-String(一)
  • 服务器硬件的基础知识
  • java基于ssm+jsp 汽车在线销售系统
  • 【干货】Android中高级开发进阶必备资料(附:PDF+视频+源码笔记)
  • AI通用写作模版,可以在此基础上进行修改
  • openEuler2203SP3自定义ios
  • 一年又一年志愿
  • NL2SQL进阶系列(1):DB-GPT-Hub、SQLcoder、Text2SQL开源应用实践详解
  • OpenGL3.3_C++_Windows(15)