Java成长之路三
运算符
- 运算符操纵数据;
- 所有运算符都能根据自己的运算生成一个值;
- 此外一些运算符可以改变运算对象的值,这叫做“副作用”(Side Effect)
- 几乎所有的运算符只能操作基本类型(Primitives),例外是
=
, ==
和!=
,它们能操作所有对象;
- 此外String支持
+
和 +=
;
优先级
- 运算符的优先级决定了存在多个运算符时,一个表达式的各个运算顺序;
赋值
=
右边赋值给左边的变量,右边可以使任何变量,常量或者可以产生一个返回值的表达式,但左边必须是一个明确已知的变量;
- 必须有一个物理空间来存放右边的值;
- 基本类型的赋值是直接的,而不像对象,赋予的只是内存的引用;
- 若
a=b
中,b是基本类型,那么赋值操作是将b的值复制一份给变量a;若a的值发生改变是不会影响到b;
- 若为对象赋值,实际操作的是其引用;我们将右边的对象赋予左边时,赋予的是该对象的引用此时两者指向的堆中的对象还是同一个;
- 当t1和t2指向堆中同一个对象时,通常称为别名(aliasing).
算术运算符
+,-,*,/,%
%
取模(从证书除法中获得余数,整数除法会直接砍掉小数,而不是进位)
Random(seed)
不代参数的Random会利用当前的时间作为随机”种子”(seed),从而为程序每次执行生成不同的输出;
++a
、--a
先执行递增/递减运算再返回值;
a++
、a--
先返回值再执行递增/递减运算;
关系运算符
- 关系运算符会通过产生一个布尔(boolean)结果来表示操作数之间的关系;
>,<,!=,==,>=,<=
- 比较两个对象内容是否相同:使用所有对象(不包括基本类型)存在的
equals()
方法;
逻辑运算符
&&,||,!
-与,或,非
- 整个表达式会运行到可以明确结果就会停止并返回结果,这意味着该逻辑表达式后半部分不会被执行到,这就是短路;
字面值常量
- 当我们向程序插入一个字面值常量(Literal)时,编译器会确切地识别它的类型;
- 当类型不明确时,必须辅以字面值常量关联来帮助编译器识别;
下划线
- 可以在数字字面量中包含下划线
_
,使结果更清晰;
- 仅限单一,不能多条相连;
- 数值开头结尾不允许出现;
- F、D和L的前后禁止出现;
- 二进制前导b和十六进制x前后禁止出现;
指数计数法
- e代表自然对数的基础,约等于2.718(Java里用一种更精确的double值Match.E来表示自然对数)
- e(-43) <=>程序员<=>10(-43)次方
位运算符
&,|,~,^
~
为一元运算符不能与=
联合使用,其他均可;
^
异或(相同为0,不相同为1);
- 位运算符具有逻辑运算符相同的结果,只是它不会中途“短路”;
- 在移位表达式中,禁止使用逻辑运算符;
移位运算符
- 运算对象是二进制的“位”,只能用于处理证书类型其中一种;
- 左移位运算符
<<
能将其左边的运算对象的左移董右侧指定的位数;右移位运算符>>
;
- 右移位运算符有正负值;若为正,则在高位插入0;若为负,则高位输入1;
- “不分正负”的右移位运算符
>>>
,默认高位植入0;
- 如果移动char,byte和short,则在移动前将其提升为int,结果为int,仅使用右值(value)的5个低阶位。若对一个long值进行处理,最后得到的结果也是long;
- 移位可以与等号组合使用
>>=,<<=,>>>=
左值被替代为移动后的值
- 左移尾添0,右移(正数:首填0;负数:添1)
三元运算符
字符串运算符
- 连接字符串 “+”
- 若表达式以一个String类型开头(编译器会自动将双引号”“标注的字符序列专为字符串)
- "”空字符串跟着一个基本类型的数据,这是隐式将其转换为字符串,以代替繁琐的显式调用方法;
类型转换
int i = (int)5.4;
- 基本类型的数据可转换为另一种基本类型的数据;(除了布尔型)
- 类是不能进行类型转换的;
float
和double
转换为整数时,小数位将被截断;
- 若想四舍五入,需使用
java.lang.math
中的round()方法;
类型提升
- 对小于int的基本数据类型(即char,byte或short)执行任何算术运算或按位操作,这些类型都会提升为int,结果为int。若想使用转小的类型,必须进行强制转换;
- float * double => double