浅析Java的"克隆"办法[Java编程]
本文“浅析Java的"克隆"办法[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
Java语言的一个长处就是撤消了指针的概念,但也招致了很多程序员在编程中常常忽视了对象与引用的辨别,本文会试图澄清这一概念.并且由于Java不能通过简单的赋值来办理对象复制的问题,在开辟历程中,也常常要要利用clone()办法来复制对象.本文会让你理解什么是影子clone与深度clone,熟习它们的辨别、长处及缺陷.
看到这个标题,是不是有点困惑:Java语言明确阐明撤消了指针,因为指针常常是在带来便利的同时也是招致代码不安全的本源,同时也会使程序的变得非常复杂难以理解,滥用指针写成的代码不亚于利用早已臭名昭著的"GOTO"语句.Java放弃指针的概念绝对是极端明智的.但这只是在Java语言中没有明确的指针定义,实质上每一个new语句返回的都是一个指针的引用,只不过在大多时刻Java中不用关心若何操作这个"指针",更不用象在操作C++的指针那样胆战心惊.唯一要多多关心的是在给函数传送对象的时刻.以下例程:
package reference;
class Obj{
String str = "init value";
public String toString(){
return str;
}
}
public class ObjRef{
Obj aObj = new Obj();
int aInt = 11;
public void changeObj(Obj inObj){
inObj.str = "changed value";
}
public void changePri(int inInt){
inInt = 22;
}
public static void main(String[] args)
{
ObjRef oRef = new ObjRef();
System.out.println("Before call changeObj() method: " + oRef.aObj);
oRef.changeObj(oRef.aObj);
System.out.println("After call changeObj() method: " + oRef.aObj);
System.out.println("==================Print Primtive=================");
System.out.println("Before call changePri() method: " + oRef.aInt);
oRef.changePri(oRef.aInt);
System.out.println("After call changePri() method: " + oRef.aInt);
}
}
/* RUN RESULT
Before call changeObj() method: init value
After call changeObj() method: changed value
==================Print Primtive=================
Before call changePri() method: 11
After call changePri() method: 11
*
*/
这段代码的主要部份调用了两个很相近的办法,changeObj()和changePri().唯一差别的是它们一个把对象作为输入参数,另一个把Java中的基本范例int作为输入参数.并且在这两个函数体内部都对输入的参数举行了窜改.看似一样的办法,程序输出的后果却不太一样.changeObj()办法真正的把输入的参数改变了,而changePri()办法对输入的参数没有任何的改变.
从这个例子知道Java对对象和基本的数据范例的处理是不一样的.和C语言一样,当把Java的基本数据范例(如int,char,double等)作为进口参数传给函数体的时刻,传入的参数在函数体内部变成了部分变量,这个部分变量是输入参数的一个拷贝,全部的函数体内部的操作都是针对这个拷贝的操作,函数履行完毕后,这个部分变量也就完成了它的使命,它影响不到作为输入参数的变量.这种方法的参数传送被称为"值传送".而在Java顶用对象的作为进口参数的传送则缺省为"引用传送",也就是说仅仅传送了对象的一个"引用",这个"引用"的概念同C语言中的指针引用是一样的.当函数体内部对输入变量改变时,实质上就是在对这个对象的直接操作.
除了在函数传值的时刻是"引用传送",在任何用"="向对象变量赋值的时刻都是"引用传送".如:
package reference;
class PassObj
{
String str = "init value";
}
public class ObjPassvalue
{
public static void main(String[] args)
{
PassObj objA = new PassObj();
PassObj objB = objA;
objA.str = "changed in objA";
System.out.println("Print objB.str value: " + objB.str);
}
}
/* RUN RESULT
Print objB.str value: changed in objA
*/
第一句是在内存中生成一个新的PassObj对象,然后把这个PassObj的引用赋给变量objA,第二句是把PassObj对象的引用又赋给了变量objB.此时objA和objB是两个完好一致的变量,今后任何对objA的改变都平等于对objB的改变.
即便懂得了Java语言中的"指针"概念大概还会不经意间犯下面的错误.
以上是“浅析Java的"克隆"办法[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |