首先,这东西你很少关注,当你看到这篇文章,说明你确实需要关注了。
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语言中,clone方法是一个非常重要的概念,它允许对象被复制,从而创造出一个新的对象。下面我们将详细介绍Java中的clone方法,并讨论它的实现机制和应用场景。 什么是clone方法 ...
在PHP中,魔术方法是一组特殊的方法,它们具有特定的名称,可以在特定的情况下自动触发。魔术方法在PHP的开发中扮演着非常重要的角色,尤其对于面向对象编程而言,它们提供了一种灵活的方式来处理对象的状态和行为。...
### Ajax相关学习内容整理 #### 1. Ajax简介 Ajax(Asynchronous JavaScript and XML)是一种能够在不需要重新加载整个页面的情况下,更新部分网页的技术。它通过在后台与服务器进行数据交换,能够实现异步数据...
Android开发常用整理(不断扩充中)包含各种工具类、线程池、日志、自定义的控件、程序崩溃捕捉处理、默认的Application配置、常用的Adapter等 注意: > 如果需要使用FragmentTabAdapter,则需要android-support-v4....
7. **images** 文件夹:与_images相似,可能存储了额外的游戏图片资源,可能与主游戏界面、特定功能或更新内容相关。 8. **js** 文件夹:JavaScript代码库,包含游戏的核心逻辑和交互处理。JavaScript是实现网页...
图形历史记录克隆 项目 设置 yarn install 编译和热重装以进行开发 yarn serve ...整理和修复文件 yarn lint 自定义配置 请参阅。 产品需求文件 1.垂直整页滚动 2. D3.js气泡(普通视图和拆分视图)
通过使用媒体查询、百分比布局、弹性图片等技术,确保网页在不同屏幕尺寸下都能良好展示。 六、移动优先策略 考虑到移动设备的普及,开发时通常采用移动优先的方法,先为小屏幕设计,再逐步扩展到大屏幕。 七、...
个人花大量时间整理出的简历模板,内容丰富,无论是应届生,还是职场老手,都有相应的模板,节约自身时间,提升效率。 亲们下载我任何一个付费资源后,即可私信联系我免费下载其他相关资源,包含简历模板、PPT模板、...
clone_schema 处理以下对象: 表-结构(索引和键)以及可选的数据 观看次数 物化视图-结构和数据 顺序 功能/程序 类型(复合和枚举) 整理和领域 扳机 权限/ GRANT 参数: 源模式 目标架构 克隆数据 只生成DDL ...
然而,简单的`clone()`方法只能进行浅复制,即只复制对象本身的引用,不复制对象内的引用对象。为了进行深复制,我们需要覆盖`clone()`方法,确保所有的引用对象都被完全复制。 在实验的第三部分,我们将创建`...
4. **数组(Array)**:Java提供了丰富的数组操作方法,包括`clone()`, `length`属性,以及`System.arraycopy()`等。此外,`Arrays`类提供了一系列静态方法,如`sort()`, `equals()`, `fill()`等,用于排序、比较和...
git日常命令整理,从clone到切换分支,拉取数据,上传数据,回退等等。。。
整理了代码克隆检测领域的论文,记录了我的一些笔记,主要包括的论文如下: Code Clone Detection via Software Visualization Representation Learning Graph-based code semantics learning for efficient ...
以下是根据文档内容整理的知识点: 1. 面向对象的三大特性: - 封装(Encapsulation):隐藏对象的属性和实现细节,仅对外提供公共访问方式。 - 继承(Inheritance):子类自动拥有父类的属性和方法。 - 多态...
### Java面试题整理精华 #### 1. super()与this()的区别? `super()`和`this()`都是在构造函数中使用的特殊方法,但它们的作用不同。`super()`用于调用父类的构造函数,这对于继承关系中的类尤其重要,确保父类的...
根据给定的文件信息,以下为...通过以上知识点的整理,可以对Java相关的面试题有一个较为全面的准备和理解。对于希望在Java开发领域深化知识和技能的求职者来说,这些知识点对于提高面试的效率和成功率都有极大的帮助。
推特克隆项目设置npm install编译和热重装以进行开发npm run serve编译并最小化生产npm run build整理和修复文件npm run lint自定义配置请参阅。
在Java开发领域,掌握核心知识点对于应对技术面试至关重要。...以上就是根据提供的文件内容整理出的Java工程师面试要点。掌握这些知识点可以为面试提供扎实的技术基础,并能够应对面试中出现的各种技术问题。
通过以上步骤,我们不仅可以更好地理解Git的基本概念,还能掌握在实际项目中使用Git进行版本控制的具体方法。无论是对于初学者还是有经验的开发者来说,熟练掌握这些命令都将极大地提高工作效率。