`
mushme
  • 浏览: 790141 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

整理下clone方法相关内容

 
阅读更多
首先,这东西你很少关注,当你看到这篇文章,说明你确实需要关注了。
1.java没有了指针,但对象和引用是完全不同的东西。
如果函数的参数是自定义的类型(非基本类型),此时传递的是引用,而不是对象。这块要注意了,这意味着你在函数内针对对象的操作,都会直接改变对象的值。大部分时候你不想看到这样的结果的。
看下面的例子:
package test;
public class CloneTest {
	public static void main(String[] args) {
		CloneTest test=new CloneTest();
		//一般我们的做法
		Person p1=new Person();
		p1.setUserName("name");
		System.out.println(p1.getUserName());
		p1=test.changeReturn(p1);//直接将值给返回了,所以体会不到引用,因为虽然变了,但你还是用了变的对象
		System.out.println(p1.getUserName());
		
		//其它的想法,你试过吗
		Person p2=new Person();
		p2.setUserName("name2");
		System.out.println(p2.getUserName());
		test.change(p2);//这样的结果你一定没想到,p2已经值已经变了!
		System.out.println(p2.getUserName());
		
	}
	public Person changeReturn(Person p){
		p.setUserName("name change");
		return p;
	}
	public void change(Person p){
		p.setUserName("name2 change");
	}
}


基本对象不在此范畴,基本对象不会因为引用而改变,因为基本对象是先有基本对象,然后定义对象引用此基本对象。
2.另外一个相关的问题,等号=的操作,大家都知道是引用。
package test;
public class CloneTest {
	public static void main(String[] args) {
		Person p1=new Person();
		Person p2=new Person();
		p1.setUserName("name");
		p2=p1;
		p2.setUserName("name2");//你以为你修改的是p2,实际p2和p1引用的同一个内存
		System.out.println(p1.getUserName());// name2
		System.out.println(p2.getUserName());//name2
	}
}


3.那么现在的问题是,你想让两个对象的值是一样的,修改一个另外一个不受影响,如何处理呢?一个一个去循环set吗?用clone是最简单的方法。
首先让对象implements Cloneable
然后重写对象的clone方法
public Object clone() throws CloneNotSupportedException {
        //直接调用父类的clone()方法,返回克隆副本
        return super.clone();
    }

当Class A成员变量类型是java的基本类型时(外加String类型),只要实现如上简单的clone(称影子clone)就可以。但是如果Class A成员变量是数组或复杂类型时,就必须实现深度clone。
public Object clone() {
		A o = null;
		try {
			o = (A) super.clone();
            o.name=(String[])name.clone();//多一行代码,其实也很简单
		} catch (CloneNotSupportedException e) {
			e.printStackTrace();
		}
		return o;
	}

需要注意的是Class A存在更为复杂的成员变量时,如Vector等存储对象地址的容器时,就必须clone彻底。
public class A implements Cloneable {
	public String name[];
	public Vector<B> claB;
	
	public A(){
		name=new String[2];
		claB=new Vector<B>();
	}

	public Object clone() {
		A o = null;
		try {
			o = (A) super.clone();
            o.name==(String[])name.clone();//深度clone
            o.claB=new Vector<B>();//将clone进行到底
            for(int i=0;i<claB.size();i++){
	            B temp=(B)claB.get(i).clone();//当然Class B也要实现相应clone方法
	            o.claB.add(temp);
		    }
		} catch (CloneNotSupportedException e) {
			e.printStackTrace();
		}
				return o;
	}
}

参考地址:
http://blog.csdn.net/kennylee26/article/details/3947752
http://lovelace.iteye.com/blog/182772
分享到:
评论

相关推荐

    Java中的clone方法详解_动力节点Java学院整理

    Java中的clone方法详解 在Java语言中,clone方法是一个非常重要的概念,它允许对象被复制,从而创造出一个新的对象。下面我们将详细介绍Java中的clone方法,并讨论它的实现机制和应用场景。 什么是clone方法 ...

    PHP 魔术方法整理

    在PHP中,魔术方法是一组特殊的方法,它们具有特定的名称,可以在特定的情况下自动触发。魔术方法在PHP的开发中扮演着非常重要的角色,尤其对于面向对象编程而言,它们提供了一种灵活的方式来处理对象的状态和行为。...

    Ajax相关学习内容整理.pdf

    ### Ajax相关学习内容整理 #### 1. Ajax简介 Ajax(Asynchronous JavaScript and XML)是一种能够在不需要重新加载整个页面的情况下,更新部分网页的技术。它通过在后台与服务器进行数据交换,能够实现异步数据...

    Android代码-Android开发常用整理

    Android开发常用整理(不断扩充中)包含各种工具类、线程池、日志、自定义的控件、程序崩溃捕捉处理、默认的Application配置、常用的Adapter等 注意: &gt; 如果需要使用FragmentTabAdapter,则需要android-support-v4....

    武林三国Clone.rar

    7. **images** 文件夹:与_images相似,可能存储了额外的游戏图片资源,可能与主游戏界面、特定功能或更新内容相关。 8. **js** 文件夹:JavaScript代码库,包含游戏的核心逻辑和交互处理。JavaScript是实现网页...

    graphic-history-vue-clone

    图形历史记录克隆 项目 设置 yarn install 编译和热重装以进行开发 yarn serve ...整理和修复文件 yarn lint 自定义配置 请参阅。 产品需求文件 1.垂直整页滚动 2. D3.js气泡(普通视图和拆分视图)

    整理前端各种宝典内容整理前端各种宝典内容

    通过使用媒体查询、百分比布局、弹性图片等技术,确保网页在不同屏幕尺寸下都能良好展示。 六、移动优先策略 考虑到移动设备的普及,开发时通常采用移动优先的方法,先为小屏幕设计,再逐步扩展到大屏幕。 七、...

    《简历模板》--在线简历模板,欢迎Clone此项目来构建你自己的在线简历.zip

    个人花大量时间整理出的简历模板,内容丰富,无论是应届生,还是职场老手,都有相应的模板,节约自身时间,提升效率。 亲们下载我任何一个付费资源后,即可私信联系我免费下载其他相关资源,包含简历模板、PPT模板、...

    pg-clone-schema:Postgres克隆架构实用程序,而无需访问数据库。 通过运行单个功能来克隆所有对象的架构,使开发人员的工作变得轻松。 在Postgres RDS上非常方便。 实用程序由http赞助

    clone_schema 处理以下对象: 表-结构(索引和键)以及可选的数据 观看次数 物化视图-结构和数据 顺序 功能/程序 类型(复合和枚举) 整理和领域 扳机 权限/ GRANT 参数: 源模式 目标架构 克隆数据 只生成DDL ...

    Java实验3[整理].pdf

    然而,简单的`clone()`方法只能进行浅复制,即只复制对象本身的引用,不复制对象内的引用对象。为了进行深复制,我们需要覆盖`clone()`方法,确保所有的引用对象都被完全复制。 在实验的第三部分,我们将创建`...

    java源码整理包

    4. **数组(Array)**:Java提供了丰富的数组操作方法,包括`clone()`, `length`属性,以及`System.arraycopy()`等。此外,`Arrays`类提供了一系列静态方法,如`sort()`, `equals()`, `fill()`等,用于排序、比较和...

    git日常命令整理

    git日常命令整理,从clone到切换分支,拉取数据,上传数据,回退等等。。。

    文献整理-代码克隆检测-相关学习笔记

    整理了代码克隆检测领域的论文,记录了我的一些笔记,主要包括的论文如下: Code Clone Detection via Software Visualization Representation Learning Graph-based code semantics learning for efficient ...

    JAVA面试题汇总.pdf

    以下是根据文档内容整理的知识点: 1. 面向对象的三大特性: - 封装(Encapsulation):隐藏对象的属性和实现细节,仅对外提供公共访问方式。 - 继承(Inheritance):子类自动拥有父类的属性和方法。 - 多态...

    Java面试题整理精华

    ### Java面试题整理精华 #### 1. super()与this()的区别? `super()`和`this()`都是在构造函数中使用的特殊方法,但它们的作用不同。`super()`用于调用父类的构造函数,这对于继承关系中的类尤其重要,确保父类的...

    面试笔记整理.pdf

    根据给定的文件信息,以下为...通过以上知识点的整理,可以对Java相关的面试题有一个较为全面的准备和理解。对于希望在Java开发领域深化知识和技能的求职者来说,这些知识点对于提高面试的效率和成功率都有极大的帮助。

    twitter-clone:Vue.js Twitter克隆

    推特克隆项目设置npm install编译和热重装以进行开发npm run serve编译并最小化生产npm run build整理和修复文件npm run lint自定义配置请参阅。

    干货!资深java工程师面试要点大全+一年整理.pdf

    在Java开发领域,掌握核心知识点对于应对技术面试至关重要。...以上就是根据提供的文件内容整理出的Java工程师面试要点。掌握这些知识点可以为面试提供扎实的技术基础,并能够应对面试中出现的各种技术问题。

    Git整理笔记

    通过以上步骤,我们不仅可以更好地理解Git的基本概念,还能掌握在实际项目中使用Git进行版本控制的具体方法。无论是对于初学者还是有经验的开发者来说,熟练掌握这些命令都将极大地提高工作效率。

Global site tag (gtag.js) - Google Analytics