为了理解java的clone,有必要先温习以下的知识。

java的类型,java的类型分为两大类,一类为primitive,如int,另一类为引用类型,如String,Object等等。

java引用类型的存储,java的引用类型都是存储在堆上的。

Java代码

public class B {

int a;

String b;

public B(int a, String b) {

super();

this.a = a;

this.b = b;

}

}

对这样一个引用类型的实例,我们可以推测,在堆上它的内存存储形式(除去指向class的引用,锁的管理等等内务事务所占内存),应该有一个int值表示a,以及一个引用,该引用指向b在堆上的存储空间。

为什么要clone

恩,因为需要。废话。

有名的GoF设计模式里有一个模式为原型模式,用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象.

简单的说就是clone一个对象实例。使得clone出来的copy和原有的对象一模一样。

插一个简单使用clone的例子,如果一个对象内部有可变对象实例的话,public API不应该直接返回该对象的引用,以防调用方的code改变该对象的内部状态。这个时候可以返回该对象的clone。

问题来了,什么叫一模一样。

一般来说,有

x.clone() != x

x.clone().getClass() == x.getClass()

x.clone().equals(x)

但是这些都不是强制的。

我们需要什么样的clone就搞出什么样的clone好了。

一般而言,我们要的clone应该是这样的。copy和原型的内容一样,但是又是彼此隔离的。即在clone之后,改变其中一个不影响另外一个。

Object的clone以及为什么如此实现

Object的clone的行为是最简单的。以堆上的内存存储解释的话(不计内务内存),对一个对象a的clone就是在堆上分配一个和a在堆上所占存储空间一样大的一块地方,然后把a的堆上内存的内容复制到这个新分配的内存空间上。

看例子。

Java代码

class User {

String name;

int age;

}

class Account implements Cloneable {

User user;

long balance;

@Override

public Object clone() throws CloneNotSupportedException {

return super.clone();

}

}

Java代码

// user.

User user = new User();

user.name = "user";

user.age = 20;

// account.

Account account = new Account();

account.user = user;

account.balance = 10000;

// copy.

Account copy = (Account) account.clone();

// balance因为是primitive,所以copy和原型是相等且独立的。

Assert.assertEquals(copy.balance, account.balance);

copy.balance = 20000;

// 改变copy不影响原型。

Assert.assertTrue(copy.balance != account.balance);

// user因为是引用类型,所以copy和原型的引用是同一的。

Assert.assertTrue(copy.user == account.user);

copy.user.name = "newName";

// 改变的是同一个东西。

Assert.assertEquals("newName", account.user.name);

恩,默认实现是帮了我们一些忙,但是不是全部。

primitive的确做到了相等且隔离。

引用类型仅仅是复制了一下引用,copy和原型引用的东西是一样的。

java强克隆_java之克隆clone解密相关推荐

  1. java 如何实现对象克隆_Java对象克隆

    Java不提供克隆(复制)对象的自动机制.克隆对象意味着逐位复制对象的内容.要支持克隆操作,请在类中实现clone()方法.Object类中的clone()方法的声明如下: protected Obj ...

  2. java 子类克隆_Java对象克隆了解

    1.java接口中有一种空的接口叫标识接口,这种接口值起到标识作用. 2.要实现java对象克隆需要用到Object类的 protected Object clone() throws CloneNo ...

  3. java 对象克隆_JAVA对象克隆

    1> 为了获取对象的一份拷贝,我们可以利用Object类的clone()方法. 2> 在派生类中覆盖基类的clone(),并声明为public. 3> 在派生类的clone()方法中 ...

  4. java对象序列化克隆_JAVA 对象克隆和序列化

    先用一个例子来说明假克隆吧,也就是用"="之后的效果.. [运行结果]: [运行结果] 姓名:rollen年龄:20 姓名:hello world年龄:100 姓名:hello w ...

  5. java ase 加密_java实现ase加密解密

    展开全部 这个算法java SDK自带的额 参考代码如下: /**解密 * @param content  待解密内容 * @param password 解密密钥 * @return */ publ ...

  6. java获取密钥长度_java.security.InvalidKeyException:解密期间密钥大小错误

    在解密期间,我得到的是"错误的密钥大小"或"给定的最终块未正确填充" ,这取决于我正在运行的操作系统. 在Win7上,使用IBMJCE或SUNJCE(两者都是J ...

  7. java 3des加密_Java使用3DES加密解密的流程 - 3des加密解密详细解释

    Java使用3DES加密解密的流程 ①传入共同约定的密钥(keyBytes)以及算法(Algorithm),来构建SecretKey密钥对象 SecretKey deskey = new Secret ...

  8. java rsa 验_Java使用RSA加密解密签名及校验

    RSA加密解密类: package com.ihep; import java.io.BufferedReader; import java.io.BufferedWriter; import jav ...

  9. java rsa签名_Java使用RSA加密解密签名及校验

    由于项目要用到非对称加密解密签名校验什么的,于是参考<Java加密解密的艺术>写一个RSA进行加密解密签名及校验的Demo,代码很简单,特此分享! 一.项目截图 代码下载后,导入到ecli ...

最新文章

  1. JGG:遗传发育所白洋组和曹晓风组-水稻组蛋白甲基化调控根系核心菌群
  2. UI5 repository mapping and Component-preload.js UI5RepositoryPathMapping.xml
  3. C++笔记-shared_ptr与weak_ptr需要注意的地方
  4. springboot中缓存技术的使用、原理及其运行流程
  5. 六、访问CGI变量 (基础教程6)
  6. 保障实时音视频服务体验,华为云原生媒体网络有7大秘籍
  7. 【探索PowerShell 】【二】基本操作
  8. html+css响应式布局
  9. matlab 声卡输出,请问高手关于matlab控制声卡输出的问题
  10. ns手柄pc驱动_功能特点可以打满屏!北通宙斯白金版无线游戏手柄体验
  11. Google Python命名规范
  12. 免费万能视频格式转换器是一款功能强大的全能视频格式转换软件,支持多种视频格式转换。万能视频转换器可以将RM、RMVB
  13. 力扣刷题 DAY_75 贪心
  14. WebGL矩阵变换总结(模型矩阵,视图矩阵,投影矩阵)
  15. winpe读取linux硬盘数据恢复,Acronis True Image的WinPE恢复媒体中有一个文件管理器,你知道吗?...
  16. 18-三目运算符和逗号表达式
  17. 【FreeRTOS】软件定时器的使用
  18. 苹果三代耳机_p360 AirPods Pro 苹果三代耳机
  19. C#获取动态key的json对象的值
  20. 06 MySQL数据库--查询语句学习笔记

热门文章

  1. 绩效考核如何才能突破上司的主观偏见局限?
  2. 仰望众位Oracle大牛
  3. python print函数用法_Python3.2中Print函数用法实例详解
  4. html指定表格行列书,js动态生成指定行数的表格
  5. 微信电脑客户端登陆_电脑端微信多开教程,多个微信同时登陆,工作生活两不误...
  6. java 函数内部类_java 内部类详解 转
  7. reddit android app,reddit安卓版app
  8. 怎么修复手机服务器,新手机怎么恢复旧手机上的所有数据?
  9. java datetime和date_Java 8时间接口localDateTime和Date的对比
  10. 第十七届全国大学生智能车竞赛完全模型组 I 型车模数据