本文转载自:http://blog.csdn.net/mengxiangyue/article/details/6818611

Java中我们可能都遇到过这样的情况,在我们将一个对象做为参数传给一个函数的时候,我们希望在这个函数中所做的操做,并不会影响到这个对象本身。但是在java传递都是引用,所以往往我们在函数内部改变了对象的某一个值,在函数外面调用该对象的时候,相应的值也同样被改变了,例如下面的程序:

class Test

{

static void myMethod(Point pt1)

{

pt1.x = 23;

System.out.println("x="+pt1.x);

}

public static void main(String[] args)

{

Point pt = new Point(2,4);

System.out.println("x="+pt.x);

myMethod(pt);

System.out.println("x="+pt.x);

}

}

class Point{

int x,y;

Point (int x,int y)

{

this.x = x;

this.y = y;

}

}

输出的结果是

x=2

x=23

x=23

但是我们想要的结果是在我们调用了函数myMethod()方法后x的值不会改变,仍然是2。由于java中的传参是引用类型,所以会出现这样的结果,我们希望传递的是对象的一份拷贝,所以这里就用到了Object的clone()方法。

克隆的实现需要一下几步:

在派生类中覆盖基类的clone()方法,并声明为public。

在派生类的clone()方法中,调用super.clone()。

在派生类中实现Cloneable接口。Cloneable接口没有任何抽象的方法,这样的成为标识接口。实现这个接口,只是为了告诉编译器这个对象可以被克隆了。我们按照上面的步骤将上面的代码修改如下:

class Test
{
static void   myMethod(Point pt1)
{
pt1.x = 23;
System.out.println("x="+pt1.x);
}
   public static void main(String[] args)
   {
  Point pt = new Point(2,4);
  System.out.println("x="+pt.x);
  Point pt2 = (Point)pt.clone();
  myMethod(pt2);
  System.out.println("x="+pt.x);
   }
}
class Point implements Cloneable{
   int x,y;   
   Point (int x,int y)
   {
       this.x = x;
      this.y = y;
   }
   public Object clone()
   {
  Point p = null;
  try
  {
  p = (Point)super.clone();
  }
  catch (Exception e)
  {
  e.printStackTrace();
  }
  return p;
   }
}

输出的结果是:

x=2
x=23
x=2

首先我们在派生类中覆盖了Object类的Clone()方法,并声明为public的。然后我们调用了super.clone()方法,这里会抛出一个异常(对于这个异常大家可以自己查看java的帮助文档),所以必须用try……catch……语句捕获,然后返回此对象。这里需要说明一下,Clone()方法返回的是Object类型的,所以需要强制类型转换

对于javaclone()方法的浅析希望能给您带来帮助。

最新文章

  1. gulp之压缩合并MD5清空替换加前缀以及自动编译自动刷新浏览器大全
  2. 打开QQ会话
  3. TRUNCATE TABLE (Transact-SQL)
  4. android自定义控件(1)-点击实现开关按钮切换
  5. 【循序渐进学Python】2. Python中的序列——列表和元组
  6. LINUX信息安全系统设计基础第二周学习总结
  7. 获取Web.config配置节
  8. 在Android4.4上新增加keycode
  9. PO_PO系列 - 采购单管理分析(案例)
  10. HTML5会砸掉iOS和Android开发者的饭碗么?
  11. 使用hbase的api创建表时出现的异常
  12. .net数据根据字段进行分类(linq语句)
  13. boost------signals2的使用2(Boost程序库完全开发指南)读书笔记
  14. classPath与PATH
  15. Ansible系列(五):各种变量定义方式和变量引用
  16. 【调优】kafka性能调优
  17. express next function
  18. bat批处理文件运行时隐藏cmd窗口
  19. HashCode的秘密
  20. thinkphp session如何取数组

热门文章

  1. 朴素贝叶斯文本分类-在《红楼梦》作者鉴别的应用上(python实现)
  2. react 路由
  3. java中线程状态
  4. PHP AJAX 返回JSON 数据
  5. ccf 201612-3 权限查询
  6. libvirt报错总结
  7. SAS数据挖掘实战篇【四】
  8. iOS限制输入解决方法
  9. 实验一part1.1 1.2
  10. Qt QLabel添加cliked事件