Java-clone总结
--陆游 问渠那得清如许,为有源头活水来 --朱熹
Clone(浅拷贝,影子拷贝),什么时候使用deep Clone(深拷贝):主要看具体域对象的性质是什么,如果是基本类型使用shallow Clone,如果是reference
variable(引用变量)使用deep Clone。
浅拷贝:
(1) 基本的数据类型(String)是会拷贝复制一份新的对象
(2)引用对象还是引用同一份对象。
浅拷贝示例代码:
public class Info {
public int idnumber;
public int getIdnumber() {
return idnumber;
}
public void setIdnumber(int idnumber) {
this.idnumber = idnumber;
}
}
public class Person implements Cloneable{
private int age;
private String nameString;
public Info info;
public Info getInfo() {
return info;
}
public void setInfo(Info info) {
this.info = info;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getNameString() {
return nameString;
}
public void setNameString(String nameString) {
this.nameString = nameString;
}
public String toString()
{
return "name:"+nameString+",age:"+age+",idnumber"+info.idnumber;
}
public Object clone()
{
Person person=null;
try {
person=(Person)super.clone(); //浅拷贝
//person.info=(Info)info.clone();
} catch (CloneNotSupportedException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
return person;
}
}
public class Hello {
public static void main(String[] args) {
// TODO 自动生成的方法存根
Info info=new Info();
info.setIdnumber(100);
Person person1=new Person();
person1.setAge(10);
person1.setNameString("tiantian");
person1.info=info;
Person person2=(Person)person1.clone();
person2.setNameString("hello");
person2.setAge(20);
person2.info.setIdnumber(200);
System.out.println("person2"+person2);
System.out.println("person1"+person1);
}
}
最后的结果是:
person2name:hello,age:20,idnumber200
person1name:tiantian,age:10,idnumber200
person1和person2的基本类型name和age都改变了,但引用类型的idnumber数值没变。
深拷贝:
(1)对存在的引用类型也进行拷贝,浅拷贝与深拷贝的代码还是有不同点的。
深拷贝代码示例:
public class Info implements Cloneable {//Info也进行拷贝
public int idnumber;
public int getIdnumber() {
return idnumber;
}
public void setIdnumber(int idnumber) {
this.idnumber = idnumber;
}
public Object clone()
{
Info info=null;
try {
info=(Info)super.clone();
} catch (CloneNotSupportedException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
return info;
}
}
public class Person implements Cloneable{
private int age;
private String nameString;
public Info info;
public Info getInfo() {
return info;
}
public void setInfo(Info info) {
this.info = info;
}
public Person() {
// TODO 自动生成的构造函数存根
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getNameString() {
return nameString;
}
public void setNameString(String nameString) {
this.nameString = nameString;
}
public String toString()
{
return "name:"+nameString+",age:"+age+",idnumber"+info.idnumber;
}
public Object clone()
{
Person person=null;
try {
person=(Person)super.clone(); //浅拷贝
person.info=(Info)info.clone();//加上这一句就变成了深拷贝,对对象引用也进行一次拷贝
} catch (CloneNotSupportedException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
return person;
}
}
结果:
person2name:hello,age:20,idnumber200
person1name:tiantian,age:10,idnumber100
所有的值都进行了改变。
Java-clone总结的更多相关文章
- java Clone之深浅拷贝
要点: 1.浅度拷贝可以不实现Cloneable接口(自动使用Object.clone)或者不重写Cloneable的clone方法. 2.要被深度拷贝的类必须实现Cloneable接口并重写clon ...
- Java clone() 方法克隆对象——深拷贝与浅拷贝
基本数据类型引用数据类型特点 1.基本数据类型的特点:直接存储在栈(stack)中的数据 2.引用数据类型的特点:存储的是该对象在栈中引用,真实的数据存放在堆内存里 引用数据类型在栈中存储了指针,该指 ...
- java Clone使用方法详解
java"指针" Java语言的一个优点就是取消了指针的概念,但也导致了许多程序员在编程中常常忽略了对象与引用的区别,本文会试图澄清这一概念.并且由于Java不能 通过 ...
- java clone简单学习
最近在帮忙写单侧的时候,经常会和这几个对象类打交道,因为对java也不是很熟悉,刚好学习一下,都是很浅的学习,并没有深入的去学习哈,因为感觉也用不上. protected Object clone() ...
- java Clone()克隆
转自:http://www.blogjava.net/orangelizq/archive/2007/10/17/153573.html 现在Clone已经不是一个新鲜词语了,伴随着“多莉”的产生这个 ...
- java clone()
Java中对象的创建 clone顾名思义就是复制, 在Java语言中, clone方法被对象调用,所以会复制对象.所谓的复制对象,首先要分配一个和源对象同样大小的空间,在这个空间中创建一个新的对象 ...
- JAVA Clone复制对象
谈到了对象的克隆,就不得不说为什么要对对象进行克隆.Java中所有的对象都是保存在堆中,而堆是供全局共享的.也就是说,如果同一个Java程序的不同方法,只要能拿到某个对象的引用,引用者就可以随意的修改 ...
- 再谈java clone 以及 浅/深拷贝
简单对象的拷贝,直接使用其clone方法 即可, 不会有什么问题: class Dog implements Cloneable public Dog clone() { int age; Strin ...
- Java clone() 浅克隆与深度克隆(转)
以下文字转自:桔子园 http://www.blogjava.net/orangelizq/archive/2007/10/17/153573.html 现在Clone已经不是一个新鲜词语了,伴随着“ ...
- Java clone方法(下)
1.终于调用的是一个JNI方法,即java本地方法,加高速度 2.使用clone方法,分为浅复制.深复制,这里直接使用网上抄来的案例来说明吧: 说明: 1)为什么我们在派生类中覆盖Object的clo ...
随机推荐
- windows10,redhat6.5下python3.5.2使用cx_Oracle链接oracle
0.序言 项目主要使用oracle但是我不太喜欢其他编程语言,加上可能需要用python部署算法包,从oracle表中读出数据,处理完成后在放回oracle中去,所以在windows上就想到先用pyt ...
- Spinner控件详解
Spinner控件详解 效果图 修改Spinner样式 在介绍之前,先看一下系统原生的样式 6.x & 5.x系统样式 4.x系统样式 官方文档 XML属性 方法 描述 android:dro ...
- 这是最好的时光,这是最坏的时光 SNAPSHOT
好久没动笔了,上次憋了好几天码出的文字扔出去,石沉大海,没惊起半点涟漪.这次真不知道能憋出个什么鬼,索性就让思绪飞扬,飞到哪是哪! --题记 此处应有BGM: 少年锦时 赵雷 1.以后真没有暑假喽 2 ...
- Android图表库MPAndroidChart(九)——神神秘秘的散点图
Android图表库MPAndroidChart(九)--神神秘秘的散点图 今天所的散点图可能用的人不多,但是也算是图表界的一股清流,我们来看下实际的效果 添加的数据有点少,但是足以表示散点图了,我们 ...
- ROS(indigo) 安装和使用更新版本的Gazebo----3,4,5,6,7 附:中国机器人大赛中型组仿真比赛说明
ROS(indigo) 安装和使用更新版本的Gazebo,本文以7为例. Gazebo7支持更多新的功能,如果使用下面命令安装ROS(indigo): ~$ sudo apt-get install ...
- java解决Url带中文参数乱码问题
首先打开Tomcat安装目录,打开conf文件,打开server.xml,找到这段代码: <Connector port="8080" protocol="HTTP ...
- nginx平台初识(二) 浏览器 HTTP 协议缓存机制详解
1.缓存的分类 缓存分为服务端侧(server side,比如 Nginx.Apache)和客户端侧(client side,比如 web browser). 服务端缓存又分为 代理服务器缓存 和 反 ...
- 【Hadoop 10周年】我与Hadoop不得不说的故事
什么是Hadoop 今年是2016年,是hadoop十岁的生日,穿越时间和空间,跟她说一声生日快乐,二千零八年一月二十八号,是一个特别的日子,hadoop带着第一声啼哭,来到了这个世界, ...
- 1.3、Android Studio创建一个Android Library
一个Android Library结构上与Android app模块相同.它可以包含构建一个app需要的所有东西,包括圆满,资源文件和AndroidManifest.xml.然而,并非编译成运行在设备 ...
- android之.9.png详解
.9.PNG是安卓开发里面的一种特殊的图片,这种格式的图片通过ADT自带的编辑工具生成,使用九宫格切分的方法,使图片支持在android 环境下的自适应展示. PNG,是一种非失真性压缩位图图形文件格 ...