操作符
- 操作符可接受一个或多个参数(即操作数),并生成一个新值
- 副作用:操作符可能会改变操作数自身的值的情况
- 几乎所有的操作符都只能操作基本类型
- =、==、!=可以操作所有的对象
- String类支持+、+=
优先级
- 当一个表达式中存在多个操作符时,操作符的优先级就决定了各个部分的计算顺序
-
推荐:使用括号明确的规定计算顺序
注意:字符串和+在一起,则+表示字符串连接,会尝试将非String类型的元素转为String类型
赋值
- 赋值使用操作符=,表示:取右边的值即右值复制到左边即左值
- 右值可以是任何常数、变量或表达式(能生成值就行)
- 左值必须是明确已命名的变量,即必须有一个物理空间可以存储右值
a = 4;
- 常数不能作左值
4 = a;(错误)
- 赋值规则
A 基本类型:直接将内容复制,互不影响
B 对象赋值:操作的是对象的引用,【别名现象】复制的是对象的引用,两个对象指向同一块内存 - 将一个对象传递给方法时,也会产生别名问题
注意:别名现象容易造成意想不到的结果
算术运算符
- 加+、减-、乘*、除/、取模%
- 整数除法会直接去掉结果的小数位,而不是四舍五入地圆整结果
- 运算和赋值可以合并,比如:x += 4;
- Random类可以生成随机数,需要设置种子;nextInt、nextFloat、nextDouble等方法,可以设置随机数的上限
- 一元减号(-)用于转换数据的符号,一元加号(+)用于将较小类型的操作数提升为int
x = -a;
x = a * -b;
自动递增和自动递减
- 递减操作符:--
- 递增操作符:++
- 前缀式:先执行运算,再生成值
++a; --a;
- 后缀式:先生成值,再执行运算
a++; a--;


注意:除了涉及赋值的操作符之外,递增或递减符是唯一具有“副作用”的操作符
关系操作符
- 关系操作符生成的是一个boolean结果
- 关系操作符计算的是操作数的值之间的关系。若关系真实,则生成true(真);若关系不真实,则生成false(假)
- 关系操作符包括:< > <= >= == !=
-
==、!=适用于所有的基本数据类型和所有对象,其他比较符不适用于boolean类型
- 如果需要比较两个对象的实际内容是否相同,则必须采用equals方法(可以自定义比较规则,默认比较的是引用),该方法不适用于基本数据类型
逻辑操作符
- 与&&、或||、非!能根据参数的逻辑关系,生成一个布尔值
- &&:两者为true,则为true,否则为false
- ||:有个为true,则为true,否则为false
-
!:取反
- 与、或、非只可应用于布尔值
注意:不可将一个非布尔值当作布尔值在逻辑表达式中使用 - 如果在使用String值的地方使用了布尔值,那么布尔值会自动转换成适当的文本形式
-
短路现象:一旦能够明确无误地确定整个表达式的值,就不再计算表达式余下的部分了
直接常量
- 直接常量后面的后缀字符标志了它的类型
- 大写或小写的L,代表long => 不建议使用小写l,容易混淆
- 大写或小写的F,代表float
- 大写或小写的D,代表double
- 十六进制数以前缀0x或0X开头,后面跟0~9或小写(大写)的a~f
- 八进制数以前缀0开头,后面跟0~7
- 二进制数没有直接常量表示方法
- Integer、Long类的静态方法toBinaryString可以输出二进制形式的字符串;对于较小的类型会自动提升为int
-
指数记数法:E或e表示10
- 如果编译器能正确地识别类型,则不必在数值后附加字符。比如:long n3 = 200;但float f4 = 2.00;会出错,因为默认浮点数当作double类型
按位操作符
- 按位操作符用来操作整数基本数据类型中的单个比特即二进制位
- 按位操作符会对两个参数对应的位执行布尔代数运算,并最终生成一个结果
- 按位与&:两个为1,则生成1,否则为0
- 按位或|:有个为1,则生成1,否则为0
- 按位异或:对应位不同,则为1,对应位相同,则为0
- 按位非~:按位取反
注意:区分按位操作与逻辑操作 - 按位操作符可与=组合使用,比如:&= |= ^= 但无~=
- 布尔类型可以作为单比特值对待,可执行按位与、按位或、按位异或,但不能执行按位非
public static void main(String args[]) { boolean b1 = true; boolean b2 = false; int i1 = 1; int i2 = 0; System.out.println(b1); System.out.println(b2); System.out.println(b1&b2);//false System.out.println(b1|b2);//true System.out.println(b1^b2);//true //error System.out.println(~b1); //error int can not & with boolean System.out.println(b1&i1);}
- 按位操作符不能中途短路
- 在移位表达式中,不能使用布尔运算
移位操作符
- 移位操作符操作的运算对象是二进制的位
- 移位操作符只可用来处理整数类型
- 左移位操作符<<:按照操作符右边指定的位数将操作符左边的操作数向左移动(低位补0)
- “有符号”右移位操作符>>:按照操作符右边指定的位数将操作符左边的操作数向右移动(若符号为正,则高位插入0;若符号为负,则高位插入1)
注意:最高位表示符号:0 为正 1为负 - “无符号” 右移位操作符>>>:按照操作符右边指定的位数将操作符左边的操作数向右移动(无论正负,高位插入0)
- 对于char、byte或short进行移位时,在移位前会被转换为int类型,并得到一个int类型的值
- 对于char、byte、short、int进行移位操作,移位操作符的右值不能超过低5位(2^5-1,为31),因为int类型只有32位,不允许全部移位所有的位
=》对于long进行移位操作,移位操作符的右值不能超过低6位 - 移位操作符可以和等号组合使用;比如:<<= >>= >>>= 会将移位后的结果赋值给左边的变量
注意:byte、char可能结果不正确,因为将int结果转换为byte、char做的是窄转换 - 数字的二进制表示形式称为:有符号的二进制补码
- 原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值
- 反码的表示方法是:正数的反码是其本身;负数的反码是在其原码的基础上, 符号位不变,其余各个位取反
-
补码的表示方法是:正数的补码就是其本身;负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1。 (即在反码的基础上+1)
-
条件操作符
- boolean-exp?value0:value1 若boolean-exp为true,则计算value0,否则计算value1
int test = boolean-exp?value0:value1
等价于
int test = 0;
if(boolean-exp){
test = value0;
}else{
test = value1;
}
字符串操作符+和+=
- +、+=用于连接不同的字符串
- 如果表达式以一个字符串起头,那么后续所有操作数都必须是字符串类型
-
编译器会把和字符串连接在一起的其他数据类型自动转换成字符串
常犯错误
- 错误一:对表达式如何计算有点不确定,但又不愿意使用括号
- 错误二:= 和 == 用错
While(x = y){//x、y都为布尔值,则不会报错导致隐藏的错误
} - 错误三:&& 与 &、|| 与 |使用混淆
类型转换
- 类型转换:将一种数据类型自动转换为另一种
- 三种类型:
- 隐式类型转换:=>扩展转换
byte by = 1;
int test = by;
- 显示类型转换:
byte by = 1;
int test = (int)by;
- 强制类型转换=>窄化转换
byte by = 1;
int test = 3;
by = (byte)test;


- 布尔型不允许类型转换
- 类不允许类型转换,但类族之间可以
- 将float和double转换为整型值时,会对数字进行截尾;若想得到舍入的结果,需要使用java.lang.Math的round()
- 类型比int小的,运算前会自动转换为int
- 通常,表达式中出现的最大的数据类型决定了表达式最终结果的数据类型
- Java不需要考虑移植问题,所有数据类型在所有机器中的大小都是相同的,所以不需要sizeof操作符
- 如果对两个很大的int值执行乘法运算,结果可能溢出
重点注意:窄化转换丢失 和 溢出
网友评论