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绑定到一个相同的对象,但是这样做又会导致新的问题,即对象内部的字段处理会发生混乱,与标准的面向对象设计原则相悖。这个问题并非看上去那么简单,暂时先不做解释。
阅读全文
0 0
- JAVA中对象赋值与主数据类型赋值的区别
- JAVA中基本数据类型的引用与对象赋值的区别
- JAVA中String直接赋值与new出来的对象赋值的区别
- java中对象的引用与赋值
- JAVA中对象的赋值与引用
- Java中对象的赋值与引用
- C++中类对象的初始化与赋值的区别
- python中表达式赋值与链式赋值的区别
- PHP中使用&赋值与=赋值的区别
- c++中赋值与初始赋值的区别
- Java的主类型赋值以及对象赋值
- java中string对象赋值
- php--对象的赋值与clone的区别
- java 中 new 对象 与 直接 赋值的对象为何不一样。
- 对象赋值,值传递与地址传递的区别
- JS对象简单、深度克隆(赋值与引用的区别)
- JS对象简单、深度克隆(赋值与引用的区别)
- 赋值与复制的区别
- 文章标题
- 微信开发-基于Ngrok的内网穿透工具-netapp
- TCP/IP协议 三次握手与四次挥手
- Liferay Requires Name Spaced Parameters(命名空间)
- 二叉树的遍历算法Java实现
- JAVA中对象赋值与主数据类型赋值的区别
- springBoot-springCloud
- js 中的replaceAll
- 配置中心
- Android保存私密信息-强大的keyStore(译)
- 微信小程序实战篇-商品详情页(二)
- JavaScript Array对象详解和项目需求
- HttpUrlConnection_Get
- python编号迭代函数enumerate(seq)