本文转载自: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()方法的浅析希望能给您带来帮助。

转载于:https://www.cnblogs.com/harrogath/p/6464077.html

浅析java中clone()方法相关推荐

  1. java深度克隆_浅析Java中clone()方法浅克隆与深度克隆

    现在Clone已经不是一个新鲜词语了,伴随着"多莉"的产生这个词语确实很"火"过一阵子,在Java中也有这么一个概念,它可以让我们很方便的"制造&qu ...

  2. java中clone方法_Java Object clone()方法– Java中的克隆

    java中clone方法 Cloning is the process of creating a copy of an Object. Java Object class comes with na ...

  3. java中clone方法的理解(深拷贝、浅拷贝)

    文章目录 前言: 知识点一:什么是浅拷贝? 知识点二:什么是深拷贝? 知识点三.java拷贝(clone)的前提: 知识点四:浅拷贝案例: 拷贝类: 测试类: 总结: 下面通过画图示意: 知识点五:深 ...

  4. 浅析Java中的final关键字

    浅析Java中的final关键字 谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来 ...

  5. 浅析Java的“克隆”方法[zt]

    Java语言的一个优点就是取消了指针的概念,但也导致了许多程序员在编程中常常忽略了对象与引用的区别,本文会试图澄清这一概念.并且由于Java不能通过简单的赋值来解决对象复制的问题,在开发过程中,也常常 ...

  6. 【转】浅析Java中的final关键字

    谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来了解final这个关键字的用法. ...

  7. 浅析Java中的Steam流

    Stream流 文章目录 Stream流 1. 集合遍历 2. 流式思想 3. Stream流 3.1 概念 3.2 流的获取 3.3 forEach 3.4 filter 3.5 map 3.6 c ...

  8. 使用java中replaceAll方法替换字符串中的反斜杠

    今天在项目中使用java中replaceAll方法将字符串中的反斜杠("\")替换成空字符串(""),结果出现如下的异常: 1 java.util.regex. ...

  9. java中collection方法_Java 8中的Collector toCollection()方法

    toCollection()Java中的Collector类的方法返回一个Collector,该Collector以遇到的顺序将输入元素累积到一个新的Collection中. 语法如下static & ...

最新文章

  1. c语言中一百以内相乘的积,一百以内的加减乘除法游戏....
  2. Openssh学习笔记
  3. CSS 属性 - 伪类和伪元素的区别
  4. vm虚拟机安装包_一次Miniconda虚拟机安装的神奇踩坑记录
  5. 迈向电商认知智能时代的基石:阿里电商认知图谱揭秘
  6. solidity合约详解
  7. DirectX SDK 重大版本变化记录[转]
  8. 简单小巧的跨平台共享内存代码
  9. swagger内部类_spring boot 1.5.4 集成spring-Data-JPA(七)
  10. mysql 查出数据后插入新建表
  11. 自适应滤波器之块自适应滤波器
  12. php中表格的高度怎么改,ppt表格行高调整不了怎么办
  13. 理解分布函数(概率论)
  14. pdf合并成一个pdf怎么合并
  15. 在PostgreSQL中创建Arcgis企业级地理数据库
  16. 07.RabbitMQ处理幂等性
  17. 数美科技风控前沿| AIGC需要什么内容风控基建?ChatGPT本“人”有话要说
  18. 个性化推荐技术的十大挑战
  19. redux 基本概念 4
  20. android 外联wap

热门文章

  1. 第二:python安装校验报错api-ms-win-crt-process-l1-1-0.dll 丢失的处理
  2. mysql数据库不小心删除文件_mysql数据库被删除了,怎么恢復吗
  3. 总线全称_一篇文章讲透I2C总线协议
  4. 若依集成jsencrypt实现密码加密传输方式
  5. 正则表达式匹配指定的tr标签
  6. Log4j CVE-2021-44228后续-CVE-2021-45046,CVE-2021-45105
  7. Jenkins 新版本及插件在Windows下的安装
  8. 15寸计算机显示器,苹果确认15寸RMBP支持全球首款5K显示器
  9. java emoji编码转换_编码:unicode、utf-8以及emoji
  10. 怎么关闭虚拟机服务器,ESXI | 命令行 | 强行关闭虚拟机进程 | 无法远程访问服务器...