浅析java中clone()方法

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

时间: 2024-12-16 17:28:26

浅析java中clone()方法的相关文章

详解java中clone方法

原文地址:http://leihuang.net/2014/11/14/java-clone/ In java, it essentially means the ability to create an object with similar state as the original object. 什么是clone 字典中的意思就是复制(强调跟原来的一模一样). *By default, java cloning is 'field by field copy' *.因为Object类不知

Java中clone方法的使用

什么是clone 在实际编程过程中,我们常常要遇到这种情况:有一个对象object1,在某一时刻object1中已经包含了一些有效值,此时可能会需要一个和object1完全相同新对象object2,并且此后对object2任何改动都不会影响到object1中的值,也就是说,object1与object2是两个独立的对象,但object2的初始值是由object1对象确定的.在Java语言中,用简单的赋值语句是不能满足这种需 求的.要满足这种需求虽然有很多途径,但实现clone()方法是其中最简单

浅析Java中的final关键字(转)

浅析Java中的final关键字 谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来了解final这个关键字的用法.下面是本文的目录大纲: 一.final关键字的基本用法 二.深入理解final关键字 若有不正之处,请多多谅解并欢迎指正. 请尊重作者劳动成果,转载请标明原文链接: http://www.cnblogs.com/dolphin0520/p/3736238.html 一

浅析Java中的访问权限控制

浅析Java中的访问权限控制 今天我们来一起了解一下Java语言中的访问权限控制.在讨论访问权限控制之前,先来讨论一下为何需要访问权限控制.考虑两个场景: 场景1:工程师A编写了一个类ClassA,但是工程师A并不希望ClassA被该应用中其他所用的类都访问到,那么该如何处理? 场景2:如果工程师A编写了一个类ClassA,其中有两个方法fun1.fun2,工程师只想让fun1对外可见,也就是说,如果别的工程师来调用ClassA,只可以调用方法fun1,那么该怎么处理? 此时,访问权限控制便可以

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

谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来了解final这个关键字的用法. 一.final关键字的基本用法 在Java中,final关键字可以用来修饰类.方法和变量(包括成员变量和局部变量).下面就从这三个方面来了解一下final关键字的基本用法. 1.修饰类 当用final修饰一个类时,表明这个类不能被继承.也就是说,如果一个类你永远不会让它被继承,就可以用final进行

Java中的方法重写 与 final关键字

Java中的方法重写 与 final关键字 以下程序是否存在错误? class Base { private final void method() { System.out.println("In Base..."); } } class Sub extends Base { public void method() { System.out.println("In Sub..."); } } 答案 正确的. 使用final关键字可以声明类.成员变量和成员方法,一

java中的方法理解

1.java 方法的格式<修饰符><返回类型><方法名>(<参数列表>)返回类型说明了方法的返回值类型,如果不需要返回值,返回类型应该声明为void,需要返回值的,必须与说明的返回类型相同.2.如果一个方法的参数定为不定参数的话,这个参数可以根据参数个数动态生成一个数组,然后传入方法执行.不定参数有两个规定:方法的参数列表中最多只有一个不定长度的参数:不定长度的数组的位置必须是最后一个参数.不然不能通过编译.3.java中每个方法的返回值,有且仅有一个,因为

JavaSE学习笔记(四)——Java中的方法

一.  Java中的方法 需求:求整数10和整数3的乘积,然后在求整数2000和整数300的乘积. public class MethodTest01 { public  static void main(String[] args){ int  i = 10; int  j = 3; int  k = i * j; System.out.println("i  * j = " + k); int  l = 2000; int  m = 300; int  n = l * m; Sys

Java基础---如何定义Java中的方法(三十五)

如何定义 Java 中的方法 所谓方法,就是用来解决一类问题的代码的有序组合,是一个功能模块. 一般情况下,定义一个方法的语法是: 其中: 1. 访问修饰符:方法允许被访问的权限范围, 可以是 public.protected.private 甚至可以省略 ,其中 public 表示该方法可以被其他任何代码调用,其他几种修饰符的使用在后面章节中会详细讲解滴 2. 返回值类型:方法返回值的类型,如果方法不返回任何值,则返回值类型指定为 void :如果方法具有返回值,则需要指定返回值的类型,并且在