java语言的一个优点就是取消了指针的概念,但也导致了许多程序员在编程中常常忽略了对象与引用的区别,本文会试图澄清这一概念。并且由于java不能通过简单的赋值来解决对象复制的问题,在开发过程中,也常常要要应用clone()方法来复制对象。本文会让你了解什么是影子clone与深度clone,认识它们的区别、优点及缺点。
看到这个标题,是不是有点困惑:java语言明确说明取消了指针,因为指针往往是在带来方便的同时也是导致代码不安全的根源,同时也会使程序的变得非常复杂难以理解,滥用指针写成的代码不亚于使用早已臭名昭著的"goto"语句。java放弃指针的概念绝对是极其明智的。但这只是在java语言中没有明确的指针定义,实质上每一个new语句返回的都是一个指针的引用,只不过在大多时候java中不用关心如何操作这个"指针",更不用象在操作c++的指针那样胆战心惊。唯一要多多关心的是在给函数传递对象的时候。如下例程: 【相关文章:C++源代码的语法加亮(专门用于post】 【扩展阅读:一道初学者题目,“ 用1-9数字做不重复】 【扩展信息:[推荐]微软开发者系列讲座下载】 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对对象与基本的数据类型的处理是不一样的。... 下一页