使用运算符
运算符接受一个或多个引数(arguments),并产生新值。引数的形式不同于一般函数,但二者所产生的效应一致。
赋值、指派
赋值动作是以‘=’运算符为之。赋值(指派)的意义是取得运算符右边的值,将该值复制到运算符左边。右值可以是任何常量、变量、或有能力产生数值的表达式;左值则必须是个明确的、具名的变量,也就是说,必须有实际存储空间以存储某值。
基本型别的赋值动作相当直觉。因为基本型别存储的是实际数值,而非object reference。但进行基本型别的赋值动作时,会将某值复制到另一个值身上。
但是当操作某个对象时,操作的实际是它的reference。所以,当“将某个对象指派给另一个对象”,实际上是将其reference从某处复制到另一处。
如果对两个对象写下C=D这样的式子,会造成C和D都指向原先D所指的对象。此时如果更改D中的数据,C中的数据也会跟着变化,因为它们的reference指向的是同一个对象。这种现象通常被称为aliasing(别名),这是Java对于对象的基本处理模式,在编码过程中要特别注意。
数学运算符
Java的基本数学运算符:加法(+)、减法(-)、除法(/)、乘法(*)、模数(%,用来取整数相除后的余数)。整数除法会将所得结果的小数部分截去,不会自动四舍五入。
递增和递减
递增和递减运算符都各有两个版本,通常称为前序(prefix)版本和后续(postfix)版本。对前序递增和前序递减而言,会先进行运算然后才指派其值;而后续递增和递减,会先指派其值然后才进行运算。
关系运算符
关系运算符产生的结果是boolean。关系运算符有小于(<)、大于(>)、小于等于(<=)、大于等于(>=)、等于(==)、不等于(!=)共六种。
关系运算符==和!=也可作用于对象身上,但此时比较的是object reference,而不是对象的内容。如果想知道对象的内容是否相同,则需要使用equals()函数。任何对象都拥有这个函数,但是equals()的缺省行为是拿reference来比较的,所以对于自建class需要根据实际需要来覆写equals()。
Java标准库中的大多数class都覆写了equals(),所以它们都会比较对象的内容(而非其referecne)是否相等。
逻辑运算符
逻辑运算符AND(&&)、OR(||)、NOTE(!)都会得到boolean值。此值究竟是true或false取决于引数间的逻辑关系。Java中的逻辑运算符只能作用在boolean值身上。
处理逻辑运算符时,有所谓“short circuiting(遂死、短路)”的现象发生。意思是说,当这个表达式的值可以被确切判断出真伪时,表达式的评估(核定)动作便会结束。如此一来,逻辑表达式中的某些部分就可能不会被评估到。
位运算
位运算符可以操作基本整数型别中的个别的位(bit)。位运算会在两个引数的相应位上执行布尔代数运算以求结果。
运算 | 符号 | 规则 |
---|---|---|
AND | & | 两个输入位都为1时,产生一个输出位1;否则为0。 |
OR | | | 两个输入位中有任何一个为1时,产生一个输出位1;当两个皆为0时,结果为0。 |
XOR | ^ | 两个输入位恰有一个为1(但不同时为1)时,产生结果值1;否则为0。 |
NOT | ~ | 一元运算符,产生输入位的反相。如果输入位为1,则输出0;如果输入为0,则输出1。 |
位运算符与逻辑运算符使用同一套符号。位运算符作用于整数,而逻辑运算符作用于boolean值。有个助记法,由于位很“小”,所以位运算符仅使用一个字符符号,而逻辑运算符使用两个字符符号。
位移运算符
位移运算符也用来操作位,但仅用于基本整数型别身上。左移运算符(<<)会将左左操作数向左搬移,搬移的位个数由右操作数指定(左移后,较低位会被自动补0)。带正负号的右移运算符(>>)则将左操作数向右搬移,搬移的位个数由右操作数指定。面对带正负号的数值,右移动作会采用符号扩展(sign extension)措施:如果原值是正数,较高位便补上0;如果原值是负数,较高位便补上1。此外,Java还增加了无正负号的右移运算符(>>>),采用所谓的零扩展(zero extension):不论原值是正或负,一律在较高位处补0。
如果你所操作的位移对象是char、byte、short,位移动作发生之前,其值会被晋升成int,运算结果会是int。运算符右端所指定的位移个数,仅有较低的5个位有用。这样可以避免移动超过int所具备的位数(
应用于String身上的+
String + 的运用有一些很有趣的行为。如果某个表达式以String为首,那么接续的所有操作数也都必须是String(编译器会将双引号括住的字符序列自动转化为String):
int x = 0, y = 1, z = 2;
String sString = "x, y, z";
System.out.println(sString + x + y + z);
在这里,Java编译器会将x、y、z转化为它们各自的String表达式,而不是先将它们加在一起。
System.out.println(x + sString);
Java会将x转换为String。
运算符优先级
优先级 | 运算符 | 结合性 |
---|---|---|
1 | ||
2 | ||
3 | ||
4 | ||
5 | ||
6 | ||
7 | ||
8 | ||
9 | ||
10 | ||
11 | ||
12 | ||
13 | ||
14 |
流程控制
if-else
while
do-while
for
switch