JAVA中对象赋值与主数据类型赋值的区别

来源:互联网 发布:阿里云主机购买 编辑:程序博客网 时间:2024/05/17 06:53

在JAVA中,赋值操作是用“=”来进行的,对于主数据类型来说,赋值操作是非常直接的,主类型容纳实际的值,假若有两个int类型的A和B变量,在进行“A=B”时,B处的内容复制到A处,若A处内容发生改变,B处内容依然保持原值并不发生改变。

然而,对于对象见的赋值操作来说并非如此,,如下例:

import java.util.*;class Number{int i;}public class Projiect3 {public static void main(String[] args) {// TODO Auto-generated method stubNumber n1 = new Number();Number n2 = new Number();n1.i = 9;n2.i = 47;System.out.println("1:n1.i:"+n1.i+",n2.i:"+n2.i);n1 = n2;System.out.println("2:n1.i:"+n1.i+",n2.i:"+n2.i);n1.i = 27;System.out.println("3:n1.i:"+n1.i+",n2.i:"+n2.i);}}
程序执行结果为:

当我们对对象进行操作时,我们真正操作的是对象的句柄,首先什么是句柄,我们可以简单理解为区别一个对象的唯一整数,也就是一个对象特有的身份编号,所以如果“从一个对象到另一个对象”赋值,实际上是将句柄从一个地方复制到另一个地方,这意味着如果为对象使用“A=B”,那么A和B最终都会指向最初只有B才指向的那个对象。简单的说对于上述例子中的“n1=n2”来说,实际上我们赋予了两个对象相同的句柄,并且在赋值的过程中,该句柄实际上已经由“垃圾收集器”清除,导致第三次的输出结果中n2随着n1的改变而改变,那么我们一定是希望n1和n2是相互独立的两个对象,那么更改上述代码:

import java.util.*;class Number{int i;}public class Projiect3 {public static void main(String[] args) {// TODO Auto-generated method stubNumber n1 = new Number();Number n2 = new Number();n1.i = 9;n2.i = 47;System.out.println("1:n1.i:"+n1.i+",n2.i:"+n2.i);n1.i = n2.i;System.out.println("2:n1.i:"+n1.i+",n2.i:"+n2.i);n1.i = 27;System.out.println("3:n1.i:"+n1.i+",n2.i:"+n2.i);}}
此时程序执行结果为:

这样便可以保留两个独立的对象,而不是将n1和n2绑定到一个相同的对象,但是这样做又会导致新的问题,即对象内部的字段处理会发生混乱,与标准的面向对象设计原则相悖。这个问题并非看上去那么简单,暂时先不做解释。














原创粉丝点击