当前位置:七道奇文章资讯编程技术Java编程
日期:2011-03-22 16:15:00  来源:本站整理

浅析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编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:

  • 浅析Java中Data类的操纵
  • Java底子:浅析Java抽象类和接口的比较
  • 浅析Java语言中存在两种主要非常的差别
  • 浅析Java语言中的内部类
  • 浅析Java的"克隆"办法
  • 浅析Java的线程机制
  • 浅析Java EE容器重安置时间的调查数据
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .