简明现代魔法 -> Java编程语言 -> 引用与对象赋值时的别名现象

引用与对象赋值时的别名现象

2009-09-08

要对一个对象进行操作,我们真正能操作的是该对象的引用。

所以,如果需要“将一个对象赋值给另外一个对象”,实际上只是改变其中一个对象的指向,使2个reference都指向heap里的同一个对象。

一个简单的程序

package Phase1;

class Digimon {

int attack;

int defence;

}

public class aliasing {

public static void main(String[] args){

// 从类 Digimon 创建两个对象:亚古兽、加鲁鲁兽

Digimon Agu = new Digimon();

Digimon Kalulu = new Digimon();

// 亚古兽的攻击力为9,加鲁鲁兽的攻击力为47

Agu.attack = 9;

Kalulu.attack = 47;

// 输出下攻击数值

System.out.println("亚古兽攻击力:" + Agu.attack + "; " +

"加鲁鲁兽攻击力:" + Kalulu.attack + "。 ");

// 对object加鲁鲁兽赋给object亚古兽(误),结果如何?(实际只改了引用,对象不变)

Agu = Kalulu;

// 其实就是让指向亚古兽的reference指向加鲁鲁兽的对象了

System.out.println("亚古兽攻击力:" + Agu.attack + "; " +

"加鲁鲁兽攻击力:" + Kalulu.attack + "。 ");

// 将亚古兽的攻击力修正为27吧(注意,Agu现在已经指向加鲁鲁兽对象了)

// 或者说,Agu现在也就是加鲁鲁兽

Agu.attack = 27;

// 看看输出测试吧

System.out.println("亚古兽攻击力:" + Agu.attack + "; " +

"加鲁鲁兽攻击力:" + Kalulu.attack + "。 ");

}

}

程序运行结果

亚古兽攻击力:9; 加鲁鲁兽攻击力:47。

亚古兽攻击力:47; 加鲁鲁兽攻击力:47。

亚古兽攻击力:27; 加鲁鲁兽攻击力:27。

当Agu = Kalulu;这一句代码执行之后,object亚古兽没有reference指向了,它将会被垃圾回收器自动清理。

这种特殊的现象称作“别名现象”,是Java操作对象的一种基本方式。

如果不想产生别名现象,可以这么写:Agu.attack = Kalulu.attack;

这样就可以保持两个对象彼此独立,而不是将两个reference同时绑定到同一个对象上面去。

java 别名现象_引用与对象赋值时的别名现象相关推荐

  1. JAVA移慎_java里面给对象赋值,慎用赋值符号(=) (转)

    java里面给对象赋值,慎用赋值符号(=) (转)[@more@] 对于来说,注意变量名类似于指针,所以请慎用赋值符号(=)! 比如下面的代码: ArrayList alAll = new Array ...

  2. Java学习笔记_类和对象

    ·类:是一组相关属性和行为的集合,可以看成是一类事务的模板,使用事物的属性特征和行为特征来描述该类事物. ·属性:该事物的状态信息 ·行为:就是该事物能够做什么 ·对象:一类事物的具体体现,对象是类的 ...

  3. java list数组排序_浅谈对象数组或list排序及Collections排序原理

    常需要对list进行排序,小到List,大到对自定义的类进行排序.不需要自行归并或堆排序.简单实现一个接口即可. 本文先会介绍利用Collections对List进行排序,继而讲到Collection ...

  4. java class类型参数_使用Class对象实例化Java类型参数/ generic

    如何实例化Java泛型对象,该对象仅接受类或参数给出的类型参数宾语? 例如: 通常,可以使用以下语法实例化Integer对象的ArrayList: ArrayList foo = new ArrayL ...

  5. java polygon 用法_从Polygon对象的Java中更新几何图形

    我正在尝试使用外部文件中的数据更新PostGIs几何列.某些多边形中的点数超过35k,并且ST_GeomFromText方法不起作用,因为文本字符串太长.我可以将这些点读入Polygon对象,我想做的 ...

  6. java同类型同字段名称对象赋值

    import org.springframework.beans.BeanUtils; //第一个参数是源,第二个参数是目标. BeanUtils.copyProperties(origin, tar ...

  7. 对象赋值时this指向问题 obj1.say = obj2.say;obj1.say()

    今天碰到一个问题,有如下的两个对象,问执行obj1.say()输出什么? var obj1 = ( function() {var inner = 'a-1'return {inner: 'a-2', ...

  8. ews java 新建邮箱_通过EWS发送电子邮件时使用自定义显示名称

    我正在使用 EWS (Exchange Web Services) 与 Exchange 2010 在我们的组织内部生成和发送电子邮件 . 我们目前有一个邮箱/用户,我们所有的应用程序都通过这个邮箱/ ...

  9. c盘java文件误删_电脑清理C盘时误删重要文件如何恢复

    我们都知道C盘是电脑的系统盘,储存很多重要的文件.windows系统在下载软件的时候,如果不更改存放位置,系统会默认放在C盘中,时间久了堆积大量文件,系统运行速度变慢.定期清理C盘文件可以加快运行速度 ...

最新文章

  1. 【Scratch】青少年蓝桥杯_每日一题_2.01_画五角星
  2. TensorFlow: Could not load requested Qt binding.
  3. 计算机屏幕偏白,电脑屏幕显示泛白怎么修正
  4. java方法带参数返回值_Java方法中的参数太多,第6部分:方法返回
  5. mysql5.6-5.7性能调优
  6. 2022新考纲408计组详细思维导图分享
  7. B站的热门视频要怎么同时批量下载保存到本地电脑中
  8. php 防挂马,织梦dedecms安全设置防挂马教程
  9. 吴恩达老师深度学习课程完整笔记
  10. 软件架构设计杂记: 好作品是改出来的,好的代码是不断重构打磨出来的, 心性是历经艰难困苦修炼出来的
  11. MS-DOS基本操作汇总
  12. 计算机二级c语言预测,计算机二级C语言考前预测上机试题及解析
  13. new BigDecimal比较大小
  14. input 验证码 密码 输入框
  15. 如何学习大数据?这才是完整的大数据学习体系!!
  16. 错误解决:failed calling webhook “dec-autonomy.xxx.io“: failed to call webhook:post
  17. 个人作品展示(开源)
  18. 关于ADPCM编码和PCM编码的wave文件通过Java进行相互转换
  19. 10分钟教你玩起来freemodbus
  20. 邮政储蓄银行 软件开发 2020暑期实习 面试回忆

热门文章

  1. 百度笔试题——首相的密道
  2. APS系统是什么?APS系统是什么意思?
  3. C# .Net 小程序消息推送配置+详细代码
  4. 系统工程(SE)学习笔记(四)——系统架构设计
  5. 微信小程序组件化的解决方案
  6. 前端Javascript面试题
  7. entrypoint size limit: The following entrypoint(s) combined asset size exceeds the recommended limit
  8. 新媒体营销方式的优势
  9. mysql中字段长度到底是字符数还是字节数?
  10. gcc -m32报错的解决办法