Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 398|回复: 0

[Java基础知识]java中的别名机制

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-9-30 17:43:31 | 显示全部楼层 |阅读模式
    别名现象主要出现在赋值的问题上:
       对基本数据类型的赋值是很简单的.基本数据类型存储了实际的数值,而并非指向一个对象的引用,所以在为其赋值的时候,是直接将一个地方的内容复制到了另一个地方.例如,对基本数据类型使用a=b,那么b的内容就复制给a.若接着又修改了a,而b根本不会受这种修改的影响.

       但是在为对象"赋值"的时候,情况却发生了变化.对一个对象进行操作时,我们真正操作的是对对象的引用.所以倘若"将一个对象赋值给另一个对象",实际是将"引用"从一个地方复制到另一个地方.这意味着假若对对象使用c=d,那么c和d都指向原本只有d的指向的那个对象.下面这个例子将向大家阐述这一点. class Tank {
        int level;
    }  
      
       
       

         
       

         
       
      
    1. class Tank {
    2.     int level;
    3. }

    4. public class Main {

    5.   
    6.     public static void main(String[] args) {
    7.         Tank t1 = new Tank();
    8.         Tank t2 = new Tank();
    9.         t1.level = 9;
    10.         t2.level = 47;
    11.         System.out.println("1:  t1.level: " + t1.level + " t2.level: " + t2.level);
    12.         t1=t2;
    13.         System.out.println("2:  t1.level: " + t1.level + " t2.level: " + t2.level);
    14.         t1.level=27;
    15.         System.out.println("3:  t1.level: " + t1.level + " t2.level: " + t2.level);
    16.          
    17.     }

    18. }
    复制代码

    运行结果:
    1: t1.level: 9 t2.level: 47
    2: t1.level: 47 t2.level: 47
    3: t1.level: 27 t2.level: 27     tank类非常简单,它的两个实例(t1和t2)是在main()里建立的.对每个tank类对象的level域都赋予了一个不同的值,然后,将t2赋给t1,接着有修改了t1.在许多编程语言中,我们可能会期望t1和t2总是相互独立的.但由于赋值操作的是一个对象的引用,
    所以修改了t1的同时也改变了t2!这是由于t1和t2包含的是相同的引用,它们指向相同的对象.

    (原本t1包含的对对象的引用, 是指向一个值为9的对象.在对t1赋值的时候,这个引用被覆盖,也就是丢失了;而那个不再被引用的对象会由"垃圾回收器"自动清理.)

        这种特殊的想象通常称作"别名想象",是java操作对象的一种基本方式.在这个例子中,如果想避免别名问题的话可以这样写:
    t1.level=t2.level;

        这样便可以保持两个对象彼此独立,而不是将t1和t2绑定到相同的对象.但你很快会意识到,直接操作对象内的域容易导致混乱,并且,违背了良好的面向对象程序设计的原则.这可不是一个小的问题,所以从现在开始大家应该留意,为对象赋值可能会产生意想不到的后果.

      
      
       
       

         
       

         
       
      
    复制代码
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-5-20 18:20 , Processed in 0.487825 second(s), 50 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表