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

在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 stub
		
		Number 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 stub
		
		Number 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绑定到一个相同的对象,但是这样做又会导致新的问题,即对象内部的字段处理会发生混乱,与标准的面向对象设计原则相悖。这个问题并非看上去那么简单,暂时先不做解释。














评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值