cloneable以及深拷贝和浅拷贝
Objec类有11个方法,有两个protected的方法,其中一个为clone方法(另一个为finalize)。
该方法的签名是:
protected native Object clone() throws CloneNotSupportedException;
因为每个类直接或间接的父类都是Object,因此它们都含有clone()方法,但是因为该方法是protected,所以都不能在类外进行访问。
要想对一个对象进行复制,就需要对clone方法覆盖。
一般步骤是(浅复制):
1. 被复制的类需要实现Clonenable接口(不实现的话在调用clone方法会抛出CloneNotSupportedException异常) 该接口为标记接口(不含任何方法)
2. 覆盖clone()方法,访问修饰符设为public。方法中调用super.clone()方法得到需要的复制对象,(native为本地方法)
jdk的集合类clone()方法默认实现为浅拷贝
如果想要深拷贝一个对象, 这个对象必须要实现Cloneable接口,重写clone方法,并且在clone方法内部,把该对象引用的其他对象也要clone一份 , 这就要求这个成员变量对象必须也要实现Cloneable接口,并且重写clone方法。对于超过两层嵌套的情况,则要所有成员变量都递归的实现clone方法才能实现完全的深拷贝。
应用:
不可变类:线程安全
不可变类:所谓的不可变类是指这个类的实例一旦创建完成后,就不能改变其成员变量值。如JDK内部自带的很多不可变类:Interger、Long和String等。
可变类:相对于不可变类,可变类创建实例后可以改变其成员变量值,开发中创建的大部分类都属于可变类。
不可变类遵守如下原则:
1、使用private和final修饰符来修饰该类的属性。
2、提供带参数的构造器,用于根据传入的参数来初始化属性。
3、仅为该类属性提供getter方法,不要提供setter方法。
4、如果有必要,重写hashCode和equals方法,同时应保证两个用equals方法判断为相等的对象,其hashCode也应相等。}
通过构造器初始化所有成员,进行深拷贝(deep copy)
如果构造器传入的对象直接赋值给成员变量,还是可以通过对传入对象的修改进而导致改变内部变量的值。
最新文章
- out.print()和response.getWriter().write()区别
- 使用Autodesk Vault插件向导轻松创建Vault插件
- getpid 与 gettid 与 pthread_self
- 部署 mozilla-BrowserQuest
- TextField控件详解2
- UESTC_秋实大哥与战争 2015 UESTC Training for Data Structures<;Problem D>;
- 我的Python成长之路---第六天---Python基础(19)---2016年2月20日(晴)
- toFixed()一不小心踩了一个坑
- C# Post 参数中的特殊符号处理
- WebView内容自适应
- SOFABolt 源码分析
- CentOS下使用VirtualBox 安装 Windows虚拟机的简单方法
- 服务端工程师入门与进阶 Java 版
- Linux 上SSH 服务的配置和管理
- POJ-2018 Best Cow Fences(二分加DP)
- bzoj1294 [SCOI2009]围豆豆
- DATASNAP远程方法返回TSTREAM正解
- import sys sys.path.append(...)
- 零样本学习 - (Zero shot learning,ZSL)
- Atitit。Js调用后台语言 java c# &#160;php swing android &#160;swt的方法大总结
热门文章
- 使用 Go 语言徒手撸一个负载均衡器
- 关于vscode自动跳转回车的解决方法(关闭vscode自动保存功能;可能和其他插件有冲突)
- 【转】Vue项目报错:Uncaught SyntaxError: Unexpected token <;
- CSS3 弹性盒布局
- React-router5.x 路由的使用及配置
- 自定义View(三),仿支付宝芝麻信用自定义控件
- golang之数据转换
- linux命令实现在当前文件夹下面模糊搜索文件
- 【PyTorch v1.1.0文档研习】60分钟快速上手
- php门面模式(facade pattern)