使用Java操作符
加号和一元的正号(+) 减号和一元的负号(-) 乘号(*) 除号(/)以及赋值号(=)
几乎所有的操作符都只能操作 基本类型 例外的操作符是 = == 和 != 这些操作符能操作所有的对象 String类支持 +和+=
优先级
先乘除后加减
String后面紧跟一个 + 而这个+的后面又紧跟一个非String类型的元素时 就会尝试着将这个非String类型的元素转换为String
赋值
赋值使用操作符 = 右值可以是任何常数 变量或者表达式
基本类型的赋值是直接将一个地方的内容复制到了另一个地方
在为对象 赋值 的时候 实际是将 引用 从一个地方复制到另一个地方
别名现象 将一个对象传递给方法时 也会产生别名问题
算术操作符
加号(+) 减号(-) 除号(/) 乘号(*) 取模操作符(% 它从整数除法中产生余数)
x += 4 同时进行运算与赋值操作 x = x + 4
一元减号用于转变数据的符号 而一元加号只是为了与一元减号相对应 但是它唯一的作用仅仅是将较小类型的操作数提升为int
自动递增和递减
对于前缀递增和前缀递减(如++a或–a) 会先执行运算 再生成值 而对于后缀递增和后缀递减(如a++或a–) 会先生成值 再执行运算
关系操作符
小于(<) 大于(>) 小于或等于(<=) 大于或等于(>=) 等于(==) 不等于(!=) 等于和不等于适用于所有的基本数据类型 而其他比较符不适用于boolean类型
关系操作符= =和! =也适用于所有对象 比较的是对象的引用 比较对象的实际内容是否相同 使用equals()
这个方法不适用于 基本类型 基本类型直接使用= =和! =即可
逻辑操作符
与(&&) 或(||) 非(!)
不可将一个非布尔值当作布尔值在逻辑表达式中使用
如果在应该使用String值的地方使用了布尔值 布尔值会自动转换成适当的文本形式
短路现象 一旦能够明确无误地确定整个表达式的值 就不再计算表达式余下部分
直接常量
直接常量后面的后缀字符标志了它的类型 若为大写(或小写)的L 代表long(但是 使用小写字母l容易造成混淆 因为它看起来很像数字1) 大写(或小写)字母F 代表float 大写(或小写)字母D 则代表double
十六进制数适用于所有整数数据类型 以前缀0x(或0X) 后面跟随0-9或小写(或大写)的a-f来表示
八进制数由前缀0以及后续的0~7的数字来表示
指数计数法 在科学与工程领域 e代表自然对数的基数 约等于2.718
在Java中1.39e-43f的含义是1.39x10-43幂次
编译器通常会将指数作为双精度数(double)处理
按位操作符
按位操作符用来操作整数基本数据类型中的单个 比特(bit) 即二进制位 按位操作符会对两个参数中对应的位执行布尔代数运算 并最终生成一个结果
如果两个输入位都是1 则按位 与 操作符(&)生成一个输出位1 否则生成一个输出位0 如果两个输入位里只要有一个是1 则按位 或 操作符(|)生成一个输出位1 只有在两个输入位都是0的情况下 它才会生成一个输出位0 如果输入位的某一个是1 但不全都是1 那么按位 异或 操作(^)生成一个输出位1 按位 非(~) 也称为取反操作符 它属于一元操作符 只对一个操作数进行操作(其他按位操作符是二元操作符) 按位 非 生成与输入位相反的值——若输入0 则输出1 若输入1 则输出0
&= |= ^= 都是合法的 ~不可与=联合使用
可对布尔类型执行按位 与 或 异或 但不能执行按位 非 不会中途 短路
移位操作符
移位操作符操作的运算对象也是二进制的 位 移位操作符只可用来处理整数类型(基本类型的一种) 左移位操作符(<<)能按照操作符右侧指定的位数将操作符左边的操作数向左移动(在低位补0) 有符号 右移位操作符(>>)则按照操作符右侧指定的位数将操作符左边的操作数向右移动 有符号 右移位操作符使用 符号扩展 若符号为正 则在高位插入0 若符号为负 则在高位插入1 Java中增加了一种 无符号 右移位操作符(>>>) 它使用 零扩展:无论正负 都在高位插入0 这一操作符是C或C++中所没有的
如果对char byte或者short类型的数值进行移位处理 那么在移位进行之前 它们会被转换为int类型 并且得到的结果也是一个int类型的值 只有数值右端的低5位才有用 这样可防止我们移位超过int型值所具有的位数(因为2的5次方为32 而int型值只有32位) 若对一个long类型的数值进行处理 最后得到的结果也是long 此时只会用到数值右端的低6位 以防止移位超过long型数值具有的位数
移位 可与 等号(<<=或>>=或>>>=)组合使用 但在进行 无符号 右移位结合赋值操作时 可能会遇到一个问题:如果对byte或short值进行这样的移位运算 得到的可能不是正确的结果 它们会先被转换成int类型 再进行右移操作 然后被截断 赋值给原来的类型 在这种情况下可能得到-1的结果
最高位表示符号:0为正 1为负
数字的二进制表示形式称为 有符号的二进制补码
三元操作符 if-else
boolean-exp ? value0 : value1
如果boolean-exp(布尔表达式)的结果为true 就计算value0 如果boolean-exp(布尔表达式)的结果为false 就计算value1
可读性稍差
字符串操作符+和+=
连接不同的字符串
如果表达式以一个字符串起头 那么后续所有操作数都必须是字符串型(编译器会把双引号内的字符序列自动转成字符串)
有时会看到" " + s;以此作为不调用更加麻烦的显式方法而执行字符串转换的方式
类型转换操作符
在适当的时候 Java会将一种数据类型自动转换成另一种 假设我们为某浮点变量赋以一个整数值 编译器会将int自动转换成float 类型转换运算允许我们显式地进行这种类型的转换 或者在不能自动进行转换的时候强制进行类型转换
要想执行类型转换 需要将希望得到的数据类型置于圆括号内 放在要进行类型转换的值得左边
既可对数值进行类型转换 亦可对变量进行类型转换 编译器在必要的时候会自动进行int值到long值的提升
对于窄化转换(将能容纳更多信息的数据类型转换成无法容纳那么多信息的类型) 可能面临信息丢失的风险 必须显式地进行类型转换 而对于扩展转换 则不必显式地进行类型转换 不会造成任何信息的丢失
Java允许我们把任何基本数据类型转换成别的基本数据类型 但布尔型除外 后者根本不允许进行任何类型的转换处理 类 数据类型不允许进行类型转换 为了将一种类型转换成另一种 必须采用特殊的方法(对象可以在其所属类型的类族之间进行类型转换)
截尾和舍入 在将float或double转型为整型值时 总是对该数字执行截尾
提升 通常 表达式中出现的最大的数据类型决定了表达式最终结果的数据类型 如果将一个float值与一个double值相乘 结果就是double 如果将一个int和一个long值相加 则结果为long
Java没有sizeof
如果对两个足够大的int值执行乘法运算 结果就会溢出