前面的加减乘除四则运算,计算结果通过等号输出给指定变量,注意此时代码把变量放到等号左边。而在算术课本里,加法运算的完整写法类似于“1+1=2”这样,运算结果应该跟在等号右边。不过代数课本里的方程式存在“x=y+1”的写法,表示等号两边的结果数值是一样的,因此变量放在等号左边也是可以理解的。然而Java编程里的“=”并非数学上的相等涵义,而是一种赋值操作,所谓“赋值”,指的是将某一数值赋给某个变量的过程。计算机程序在运行的时候,不管操作什么类型的数据,都要有处地方保存运算前后的数值。变量在参与计算的时候,它可能存在多种身份,当变量作为运算过程的操作数之时,它保存的是运算前的数值;当变量作为运算结果的输出数之时,它保存的是运算后的数值。故而等号两边同时出现某个变量是完全正常的,就像下面代码演示的那样:

		// 日常生活中的加法例子是:1+1=2,运算结果在右边。但Java编程中是把运算结果放在左边的
int x = 1+1;
// 注意这里的等号是赋值操作,并非代数方程式里面的等号,否则x=x+7将会求得0=7的荒诞结果
x = x+7;

注意上述演示代码里的“x = x+7”,等号的左右两边虽然都出现了整型变量x,但是这两个x所处的时间点不同,使得它们代表的数值也不一样。等号右边的x,保存的是运算开始前的变量值,即2;而等号左边的x,保存的是运算结束后的数值,即9。所以前面的代码看似代数方程式,其实表示的是一个存在时间先后概念的赋值语句。

就赋值语句“x = x+7”而言,尽管它从数学角度来看很是无理,可是在计算机编程中却十分常见。该语句仅仅要求给某个整型变量加上若干数值,并未涉及到其它别的什么变量,好比某人的背包里原本装了三本书,然后往里面塞两本书,最终背包一共装了五本书。由于这种加法运算只对某个变量进行,因此Java又提供了“+=”运算符来简化变量的自增操作,新运算符的使用代码示例如下:

		// 对变量进行加法运算后,假如相加之和仍然保存在原变量,那么可按如下格式使用运算符“+=”
x += 7; // 该行代码等同于 x = x+7;
System.out.println("相加之和 x="+x);

既然有“+=”开了个自增运算的头,那么其它的四则运算依此类推,均可分别演变出自减运算符“-=”、自乘运算符“*=”、自除运算符“/=”,以及对变量自身取余数的运算符“%=”,相应的例子代码如下所示:

		// 运算符“-=”的作用类似“+=”,即把相减之差保存到原变量中
x -= 7; // 该行代码等同于 x = x-7;
System.out.println("相减之差 x="+x);
// 若要将相乘之积保存到原变量中,则可使用运算符“*=”
x *= 7; // 该行代码等同于 x = x*7;
System.out.println("相乘之积 x="+x);
// 若要将相除之商保存到原变量中,则可使用运算符“/=”
x /= 7; // 该行代码等同于 x = x/7;
System.out.println("相除之商 x="+x);
// 若要将相除之余保存到原变量中,则可使用运算符“%=”
x %= 7; // 该行代码等同于 x = x%7;
System.out.println("相除之余 x="+x);

推而广之,凡是对变量自身进行某种基础运算,然后运算结果又保存在该变量中,这些情况都适用于扩展了的赋值语句。譬如之前提到的按位左移操作符<<、按位右移操作符>>,均可演化出对应的自身左移运算符“<<=”,以及自身右移运算符“>>=”,这两个运算符的演示代码如下:

		// 若要将按位左移结果保存到原变量中,则可使用运算符“<<=”
x <<= 2; // 该行代码等同于 x = x << 2;
System.out.println("x按位左移两位="+x);
// 若要将按位右移结果保存到原变量中,则可使用运算符“>>=”
x >>= 2; // 该行代码等同于 x = x >> 2;
System.out.println("x按位右移两位="+x);

  

Java开发笔记(九)赋值运算符及其演化的更多相关文章

  1. Java开发笔记(八十九)缓存字节I/O流

    文件输出流FileOutputStream跟FileWriter同样有个毛病,每次调用write方法都会直接写到磁盘,使得频繁的写操作性能极其低下.正如FileWriter搭上了缓存兄弟Buffere ...

  2. Java开发笔记(二十九)大整数BigInteger

    早期的编程语言为了节约计算机的内存,给数字变量定义了各种存储规格的数值类型,比如字节型byte只占用一个字节大小,短整型short占用两个字节大小,整型int占用四个字节大小,长整型long占用八个字 ...

  3. Java开发笔记(三十九)日期工具Date

    Date是Java最早的日期工具,编程中经常通过它来获取系统的当前时间.当然使用Date也很简单,只要一个new关键字就能创建日期实例,就像以下代码示范的那样: // 创建一个新的日期实例,默认保存的 ...

  4. Java开发笔记(四十九)关键字super的用法

    前面介绍了如何从Bird类继承而来Swallow类,按道理子类应当继承父类的所有要素,但是对于构造方法来说,Swallow类仅仅继承了Bird类的默认构造方法,并未自动继承带参数的构造方法.如果子类想 ...

  5. Java开发笔记(五十九)Java8之后的扩展接口

    前面介绍了接口的基本用法,有心的朋友可能注意到这么一句话“在Java8以前,接口内部的所有方法都必须是抽象方法”,如此说来,在Java8之后,接口的内部方法也可能不是抽象方法了吗?之所以Java8对接 ...

  6. Java开发笔记(六十九)泛型类的定义及其运用

    前面从泛型方法的用法介绍到了泛型的起源,既然单个方法允许拥有泛化的参数类型,那么一个类也应当支持类级别的泛化类型,例如各种容器类型ArrayList.HashMap等等.一旦某个类的定义代码在类名称后 ...

  7. Java开发笔记(七十九)利用反射技术操作私有属性

    早在介绍多态的时候,曾经提到公鸡实例的性别属性可能被篡改为雌性,不过面向对象的三大特性包含了封装.继承和多态,只要把性别属性设置为private私有级别,也不提供setSex这样的性别修改方法,那么性 ...

  8. Java开发笔记(九十一)IO流处理简单的数据压缩

    前面介绍的文件I/O,不管是写入文本还是写入对象,文件中的数据基本是原来的模样,用记事本之类的文本编辑软件都能浏览个大概.这么存储数据,要说方便确实方便,只是不够经济划算,原因有二:其一,写入的数据可 ...

  9. Java开发笔记(九十七)利用Runnable启动线程

    前面介绍了线程的基本用法,按理说足够一般的场合使用了,只是每次开辟新线程,都得单独定义专门的线程类,着实开销不小.注意到新线程内部真正需要开发者重写的仅有run方法,其实就是一段代码块,分线程启动之后 ...

  10. Java开发笔记(九十九)定时器与定时任务

    前面介绍了线程的几种运行方式,不管哪种方式,一旦调用了线程实例的start方法,都会立即启动线程的事务处理.然而某些业务场景在事务执行时间方面有特殊需求,例如期望延迟若干时间之后才开始事务运行,又如期 ...

随机推荐

  1. cadence钻孔文件及光绘文件的生成

    完成PCB布线之后,需要生成钻孔文件和光绘文件交给PCB厂家制作PCB板,下面总结详细方法!

  2. layui 表格在排序之后没有重新渲染问题

    问题描述: 在layui表格中,最后一列增加了操作按钮,并且在某些行设置了样式,但是在排序之后,按钮的点击事件失效了,样式也没有了,可能是没有执行done回调 原因: done回调只有在render和 ...

  3. 错误:Java HotSpot(TM) 64-Bit Server VM warning: Insufficient space for shared memory file

    Java HotSpot(TM) 64-Bit Server VM warning: Insufficient space for shared memory file: /tmp/hsperfdat ...

  4. centos7zabbix-agen安装

    安装包下载地址:http://www.zabbix.com/download.php 下载对应rpm包     http://repo.zabbix.com/zabbix/ wget http://r ...

  5. f12 headers 变字典快捷方式

  6. aarch64的架构:unrecognized command line option '-mfpu=neon'

    不用添加这个'-mfpu=neon'的编译器选项了,因为这个架构下neon是默认启动的. 参考: https://lists.linaro.org/pipermail/linaro-toolchain ...

  7. HTML5 部分新增语义化标签元素

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. Raiden Charge

    2017年10月22 周日 这是个元气满满 值得纪念的一天(不好意思走错片场了) 虽然有各种乱遭的客观元素 但我们队确确实实地打铁了 那些我们轻视的 野鸡(误)大学 都在我们前面 都说知耻而后勇 虽然 ...

  9. 阿里面试100%问到,JVM性能调优篇

    JVM 调优概述 性能定义 吞吐量 - 指不考虑 GC 引起的停顿时间或内存消耗,垃圾收集器能支撑应用达到的最高性能指标. 延迟 - 其度量标准是缩短由于垃圾啊收集引起的停顿时间或者完全消除因垃圾收集 ...

  10. 微软跨平台ORM框架之EFCore

    EFCore是微软推出的跨平台ORM框架,想较于EF6.X版本,更加轻量级.EFCore目前已经更新到2.x. 接下来用CodeFirst的方式来使用EFCore. 1.创建控制台程序 2.引入EFC ...