资源描述:
《java的primitive和reference类》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、Java的数据类型分为两类:primitive和reference类型Java虽然是个面向对象的语言,也声称“Everythingisobject”-一切都是对象。但是,我觉得还不够纯粹和彻底,和ruby或者python比较一下就知道了。在Java中,数字和布尔类型就不被看做对象,而是被称为primitive类型。不过也不见的就不好,本文也不是想对此评论和分析。本文是想阐述Java的数据类型。Java的数据类型Java的数据类型分为两类:primitive和reference类型。我们可以从hold数据这
2、个角度来说。primitive类型可以hold数字和布尔数据;reference类型可以hold对象,接口和数组类型的数据的指针。可以想象后一种数据比较复杂,往往是一段数据,不像primitive的数据是比较单纯的数据单元,比如int,float和boolean。除了数据构成之外,它们在数据上的操作也大不相同。比如下面的代码,main函数里面的a和b可以进行加减运算。而x,y你就不能做加减,你只能通过他们引用或者说访问他们的数据元素。再想想对于对象引用的变量,你可以调用对象的方法。primitive类型的
3、数据上你是不能做方法调用的。你也许听说过primitive的值不能共享,而reference的值可以。什么意思呢?就是说,比如下面的代码(List1)的aboutDataSharing,你认为会输出什么呢?从下面的输出你就可以看出,c和d没有共享数据,而r和s就共享数据了。Java代码1.c=11,d=92.r={2,3}3.s={2,3}值传递还是引用传递理解了上面的区别以后,我们再看看函数方法的参数传递。先看一个例子:List1packagecom.javasaloon.basis;publiccla
4、ssPrimitiveAndReference{publicstaticvoidmain(String[]args){aboutParamTransporting();aboutDataSharing();}privatestaticvoidaboutDataSharing(){intc=10;intd=c;c++;d--;System.out.printf("c=%d,d=%d",c,d);int[]r=newint[]{1,2};int[]s=r;r[0]++;s[1]++;System.out.
5、printf("r={%d,%d}",r[0],r[1]);System.out.printf("s={%d,%d}",s[0],s[1]);}privatestaticvoidaboutParamTransporting(){inta=1;intb=2;swap(a,b);System.out.printf("a=%d,b=%d",a,b);int[]x=newint[]{10,20};int[]y=newint[]{30,50};swap(x,y);System.out.printf("x
6、={%d,%d}",x[0],x[1]);System.out.printf("y={%d,%d}",y[0],y[1]);}privatestaticvoidswap(int[]is,int[]js){int[]x=is;is=js;js=x;}privatestaticvoidswap(inti,intj){intx=i;i=j;j=x;}}你不妨先想一下上面的aboutParamTransporting方法的输出结果。如果是用c语言写的上面的swap方法呢?对于两个int的swap是没有区别
7、的,他们都是值传递。但是对于两个int数组的swap就不会一样,这也正是值传递和引用传递的区别。int数组变量x和y虽然是引用,也可以被看做是数组的指针。但是java的方法中参数的传递是应用值的传递。Java里面没有c语言一样的地址指针,这也是Java安全的基础,更是Java垃圾回收或者说内存自动管理的关键。看看下面的结果吧:a=1,b=2x={10,20}y={30,50}Equals和==的区别理解了上面的例子,我们再看看Equals和==的区别。从概念上看,primitive和reference类型
8、的数据都能进行==的比较,而且是值的比较。对于primitive来说,就是它hold的值得比较;而对于reference的比较,来说就是指针的比较,而不是它指向的对象数据的比较。如果两个reference的变量==之后得到true,说明他们共同指向同一段数据区也就是同一个对象,接口或者数组。那么,怎么进行对象数据的比较呢?这样你就得用对象的Equals方法了。Object类是所有Java类的父类,它给出了一个默认的实现,就是比