Java中的别名机制实际体现的是对于“=”这一类赋值操作符的使用规则和内涵。“=”的实际内涵是指将右边的变量的值(对于基本数据类型而言)或者某一个对象的引用(对于某个具体对象而言)复制到左边的变量名所指定的存储区域内,虽然两者可能只有细微区别但还是需要仔细区分。

  例如在对基本数据类型进行赋值操作时,比如a=b,a和b都是基本数据类型,这种情况是非常简单的,因为a和b都只是一块存储了存储了数值的内存区域,而不是指向某个对象的引用,这时赋值的操作仅仅只是将b中的数值复制给a即可,从这个角度也可以理解为什么不能给常数赋值,因为常数是没有占据内存区域的。

  而在对具体对象的引用赋值时,情况会发生变化,有点类似于C语言中的指针。“对一个对象进行操作时,我们实际操作的是对象的引用”,所以将一个对象赋值给另一个对象,实际是将一个对象的引用复制给另一个对象,例如a和b起初指向的是同一个类的不同对象,那么经过操作a=b后,a和b指向的是同一个对象。

  下面是对别名机制的展示:

  定义了person类

1 public class Person {
2 float height;
3 }

  主方法:

 public class Test {
public static void main(String[] args){
//成员变量的别名机制
Person p1 = new Person();
Person p2 = new Person();
p1.height = 180;
p2.height = 175;
System.out.println(p1.height + "," + p2.height);
p1 = p2;
System.out.println(p1.height + "," + p2.height);
p2.height = 185;
System.out.println(p1.height + "," + p2.height);
}
}

  输出:

180.0,175.0 175.0,175.0 185.0,185.0

  可以看到当执行了p1=p2后,p1和p2成员变量的值都改变了,这告诉我们一个事实:在对对象进行操作时,操作的实际是对象的引用,赋值后,两个引用实际上指向的是同一个对象,这就是java的别名机制。

Chapter3_操作符_别名机制的更多相关文章

  1. Chapter3_操作符_方法调用中的别名问题

    接下来展示方法调用中的别名问题,方法调用中的别名问题指的是,将一个对对象的引用传递给某一个方法时,方法操作的是这一个特定的引用而不是这个引用的拷贝. class Person{ float heigh ...

  2. Chapter3_操作符_逻辑操作符

    逻辑操作符与(&&)或(||)非(^)能够对布尔类型的数据类型进行操作,并且生成布尔值,和关系操作符的产生的数据类型是一样的.需要注意的不多,有以下几点: (1)在需要使用string ...

  3. Chapter3_操作符_其他操作符

    对java中其他操作符及一些注意事项的总结 (1)按位操作符 按位操作符操作基本整数类型中的单个二进制位,有与(&),或(|),非(~).按位操作符还可以和等号(=)联合使用,如~=,& ...

  4. Chapter3_操作符_关系操作符

    java中的关系操作符有等于“=”,不等于“!=”,大于“>”,小于“<”,大于等于“≥”,小于等于“≤”等.这些都不再赘述了,有一个有意思的点是关于等价性的讨论. 在java中测试两个对 ...

  5. Chapter3_操作符_算术操作符

    java中的算术操作符与其它语言并无太大区别,常用到的是以下这些: (1)加号(+),减号(-),除号(\),乘号(*),取模操作符(%),其中除号需要特别注意的是,会自动截取掉小数点后面的部分,而不 ...

  6. Chapter3_操作符_直接常量和指数计数法

    (1)直接常量 在程序中使用直接常量,相当于指导编译器,告诉它要生成什么样的类型,这样就不会产生模棱两可的情况.比如flaot a = 1f等,后缀表示告诉编译器想生成的类型.常用的后缀有l/L(lo ...

  7. Mybatis 别名机制,自动扫描 数据的增删改

    mybatis别名机制: 在mybatis.xml文件中的<configuration></configuration>标签中间加入属性<typeAliases>& ...

  8. 9.8 Binder系统_c++实现_内部机制1

    1. 内部机制_回顾binder框架关键点 binder进程通讯过程情景举例: test_server通过addservice向service_manager注册服务 test_client通过get ...

  9. C#_反射机制

    一:反射的定义 审查元数据并收集关于它的类型信息的能力.元数据(编译以后的最基本数据单元)就是一大堆的表,当编译程序集或者模块时,编译器会创建一个类定义表,一个字段定义表,和一个方法定义表等. Sys ...

随机推荐

  1. [蓝桥杯]ALGO-186.算法训练_P0501

    输入两个无符号整数x, y, 用位操作实现无符号整数的乘法运算.不用考虑整数的溢出. 输入: 输出: 题目描述 代码如下: #include <stdio.h> #include < ...

  2. 解决双击excel文件打开多个excel.exe进程的问题

    解决双击excel文件打开多个excel.exe进程的问题有些时候,双击两个excel文件,会打开多个excel进程,不同进程之间不能复制粘贴公式,只能粘贴数值,很不方便.怎么样双击多个excel文件 ...

  3. NAP(Network Access Protection)

  4. Flume架构

    Flume是Cloudera提供的一个高可用的,高可靠的,分布式的海量日志采集.聚合和传输的系统: Flume 介绍 Flume是由cloudera软件公司产出的高可用.高可靠.分布式的海量日志收集系 ...

  5. 第一课了解SQL

    1.1 数据库基础 其实一直在使用这数据库,当你在邮箱中查询名字时,当在网站上进行搜索,在自动取款机上使用ATM卡,这些操作都是在使用数据库 1.1.1 数据库   数据库:保存有组织的数据的容器(通 ...

  6. redis 10个问题

    (1)什么是redis? Redis 是一个基于内存的高性能key-value数据库. (有空再补充,有理解错误或不足欢迎指正) (2)Reids的特点 Redis本质上是一个Key-Value类型的 ...

  7. spring学习1

    1.<context:property-placeholder/> :用于从外部属性文件中获取Bean的配置 <context:property-placeholder locati ...

  8. 在C++程序中自动加入svn版本号

    原创文章,欢迎阅读,如果您想转载,请在第一行醒目注明原作者和原始链接. 为了方便追查和确认软件bug等问题,给软件或者库赋予版本号是个好办法. 最简单的版本号管理是记录编译时间: cout<&l ...

  9. phpexcel导入导出

    先下载类文件,将类文件放到lib下,然后到入口文件定义一个新的的路径,以便引入文件.    <?php namespace app\index\controller; use think\Con ...

  10. json介绍和使用

    最近在开发时需要用到json,所以在各种寻找json相关的博客,恰巧在博客园里就有一篇写的很不错的,在这里推荐下:http://www.cnblogs.com/Truly/archive/2006/1 ...