Java的基础语法(中)
运算符
运算符用于执行程序代码运算,会针对一个以上操作数项目来进行运算。任何一个运算符都要对一个或者多个数据进行操作,所以运算符又叫做操作符。Java 为了方便程序员对数据进行运算,提供了一些丰富的运算符,大致可以分为如下几组:
- 算数运算符
- 关系运算符
- 逻辑运算符
- 赋值运算符
- 位运算符
- 其他运算符
运算符在使用时应该注意数据类型的转换(详见 Java SE学习(三)之Java的基础语法(上)),当有若干个变量参与运算时,结果类型取决于这些变量中表示范围最大的那个变量类型。例如:参与运算的变量中有整型 int,有双精度浮点型 double,有短整型 short,那么最后的结果类型就是 double。
算数运算符
加法和减法运算符
加法运算符是 +
,减法运算符是 -
。它们的用法和普通数学中的用法相同,例如:3 + 5
、5 - 2
。它们需要运算符的两侧都有数据,因此称为双目运算符。在原生数据类型中,只有 boolean 类型不能进行加法和减法运算。
使用格式:
<exp1> + <exp2>
<exp1> - <exp2>
正值和负值运算符
正值运算符是 +
,负值运算符是 -
。它们看上去和加法减法运算符相同,但是它们只有右侧有数据,称为单目运算符。此外,这两个运算符都不能改变操作数本身的值。在原生数据类型中,只有 boolean 类型不能进行加法和减法运算。
使用格式:
<+><exp>
-<exp>
乘法和除法运算符
乘法运算符是 *
,除法运算符是 /
,它们都是双目运算符,虽然看上去不像在数学中使用的 ×
和 ÷
,但是用法却相同。在原生数据类型中,只有 boolean 类型不能进行加法和减法运算。
使用格式:
<exp1> * <exp2>
<exp1> / <exp2>
注意:如果 /
两边的操作数都是整型数据,系统会自动对结果进行取整(不是四舍五入,而是截掉小数部分)。
取模运算符
取模运算符是 %
,所谓取模实际上就是数学中的求余数,它的操作数可以是正整数,也可是是负数,甚至是浮点数。
使用格式:
<exp1> % <exp2>
运算规则:
a % b = a - (int)(a/b) * b
例如:
5 % 3 = 2
5 % -3 = 2
-5 % 3 = -2
-5 % -3 = -2
自增和自减运算符
自增运算符是 ++
, 自减运算符是 --
,它们都是单目运算符。其中,++
的作用是让变量的值加1,--
的作用是让变量的值减1。它们的操作时只能是变量,不能是常量,且会改变操作数本身的值。
++
和 --
既可以放在变量的前面,也可以放在变量的后面。当放在变量的前面时,表示先将变量的值加1或者减1,然后将结果作为表达式的值进行后续运算;当放在变量的后面时,表示先将变量的值作为表达式的值进行运算,然后再将变量的值加1或者减1。
使用格式:
<变量>++
++<变量>
<变量>--
--<变量>
关系运算符
关系运算符可以决定操作数之间的逻辑关系。例如,两个操作数是否相等,操作数1与操作数2相比谁大谁小等等。由关系运算符连接起来的表达式称为关系表达式,它的值都是 boolean 类型的,也就是只有 true 和 false 两个值。
相等运算符
Java 中的相等运算符为 ==
,它是一个双目运算符。
使用格式:
<exp1> == <exp2>
它的两侧可以是任意相同或者相容的数据或者表达式。例如:
5 == 3
(a * 3) == b + 2
true == true
如果 ==
两侧的值相等,则返回 true,表示等式成立;如果不相等,则返回 false,表示等式不成立。虽然 ==
可以比较浮点数,但是浮点数往往不能精确表示,因此一般不使用 ==
判断浮点数是否相等。
不相等运算符
Java 中的不相等运算符为 !=
,它也是一个双目运算符。
使用格式:
<exp1> != <exp2>
它的两侧可以是任意相同或者相容的数据或者表达式。例如:
5 != 3
(a * 3) != b + 2
true != true
果 !=
两侧的值相等,则返回 false,表示判断不成立;如果不相等,则返回 true,表示判断成立。
大小关系运算符
Java 中的大小关系运算符总共有4个,分别是 >
、<
、>=
和 <=
,它们都是双目运算符。它们的运算规则与数学中完全相同,操作数的类型可以是整型或者浮点型。
使用格式:
<exp1> > <exp2>
<exp1> < <exp2>
<exp1> >= <exp2>
<exp1> <= <exp2>
若关系成立,则返回 true,否则返回 false。
逻辑运算符
逻辑运算符用来表示一个命题 “成立” 还是 “不成立”。因此,逻辑运算符的运算结果也是 boolean类型,即true 和 false。
逻辑与运算符
逻辑与运算符是 &&
,它是双目运算符。它的操作数可以是 boolean 类型的表达式或者数据。
使用格式:
<exp1> && <exp2>
上式表达的语义是:只有当 <exp1>
和 <exp2>
同时为 true 的时候,整个表达式的值才为 true;否则,整个表达式的值为 false。
下面是逻辑与运算符的真值表:
exp1 | exp2 | exp1 && exp2 |
---|---|---|
false | false | false |
false | true | false |
true | false | false |
true | true | true |
逻辑或运算符
逻辑或运算符是 ||
,它是双目运算符。它的操作数可以是 boolean 类型的表达式或者数据。
使用格式:
<exp1> || <exp2>
上式表达的语义是:只有当 <exp1>
和 <exp2>
同时为 false 的时候,整个表达式的值才为 false;否则,整个表达式的值为 true。
下面是逻辑或运算符的真值表:
exp1 | exp2 | exp1丨丨exp2 |
---|---|---|
false | false | false |
false | true | true |
true | false | true |
true | true | true |
逻辑非运算符
逻辑非运算符是 !
,它是单目运算符。它的操作数可以是 boolean 类型的表达式或者数据。
使用格式:
!<exp>
上式表达的语义是:当 <exp>
为 false 的时候,整个表达式的值为 true;反之,整个表达式的值为 false。
下面是逻辑非运算符的真值表:
exp | !exp |
---|---|
false | true |
true | false |
短路运算
逻辑与和逻辑或运算符具有以下特性,对于表达式:
exp1 && exp2
exp1 || exp2
当以下条件有一个满足时:
- 在逻辑与表达式中,exp1 的计算结果为 false
- 在逻辑或表达式中,exp1 的计算结果为 true
则整个表达式计算完毕。因为这时已经 能够确定整个表达式的逻辑值,所以 exp2 不会被计算。这个特性,被称为短路运算。
位运算符
Java 提供了多种位运算。位运算将操作数解释为有序的 “位” 集合,这些位中的某一位或者若干位可以具有独立的含义,可以随心所欲地操作存储单元中的二进制位。位运算符通常作用于整数,且参与运算的操作数均以补码的形式出现。
按位与运算符
按位与运算符是 &
,它是双目运算符,功能是将参与运算的两个操作数各个对应的二进制位作 “与” 运算。只有当对应的两个二进制位均为1时,结果位才为1;否则为0。
使用格式:
<操作数> & <操作数>
例如:
int a = 3;
int b = 4;
System.out.println(a & b);
分析:
3 的二进制:00000000 00000000 00000000 00000011
4 的二进制:00000000 00000000 00000000 00000100
进行运算:
00000000 00000000 00000000 00000011
& 00000000 00000000 00000000 00000100
-------------------------------------
00000000 00000000 00000000 00000000
结果:0
按位或运算符
按位或运算符是 |
,它是双目运算符,功能是将参与运算的两个操作数各个对应的二进制位作 “或” 运算。只有当对应的两个二进制位均为0时,结果位才为0;否则为1。
使用格式:
<操作数> | <操作数>
例如:
int a = 3;
int b = 4;
System.out.println(a | b);
分析:
3 的二进制:00000000 00000000 00000000 00000011
4 的二进制:00000000 00000000 00000000 00000100
进行运算:
00000000 00000000 00000000 00000011
| 00000000 00000000 00000000 00000100
-------------------------------------
00000000 00000000 00000000 00000111
结果:7
按位异或运算符
按位异或运算符是 ^
,它是双目运算符,功能是将参与运算的两个操作数各个对应的二进制位作 “异或” 运算。只有当对应的两个二进制位不相同时,结果位才为1;否则为0。
使用格式:
<操作数> ^ <操作数>
例如:
int a = 3;
int b = 4;
System.out.println(a ^ b);
分析:
3 的二进制:00000000 00000000 00000000 00000011
4 的二进制:00000000 00000000 00000000 00000100
进行运算:
00000000 00000000 00000000 00000011
^ 00000000 00000000 00000000 00000100
-------------------------------------
00000000 00000000 00000000 00000111
结果:7
按位取反运算符
按位取反运算符是 ~
,它是单目运算符,功能是将参与运算的操作数的各个二进制位 “按位取反”。
使用格式:
~<操作数>
例如:
int a = 3;
System.out.println(~a);
分析:
3 的二进制:00000000 00000000 00000000 00000011
进行运算:
~ 00000000 00000000 00000000 00000011
-------------------------------------
11111111 11111111 11111111 11111100 补码
11111111 11111111 11111111 11111011 反码
10000000 00000000 00000000 00000100 原码
结果:-4
左移位运算符
左移位运算符是 <<
,它是双目运算符,功能是将 <<
左边的操作数的各个二进制位全部左移指定的位数。左移时,操作数移出左边界的位被丢弃,从右边开始用 0
填补空位。
使用格式:
<操作数> << <移位位数>
例如:
int a = 16;
System.out.println(a << 2);
分析:
16 的二进制:00000000 00000000 00000000 00010000
进行运算:
00000000 00000000 00000000 00010000
(00)00000000 00000000 00000000 01000000
结果:64
带符号右移位运算符
带符号右移位运算符是 >>
,它是双目运算符,功能是将 >>
左边的操作数的各个二进制位全部右移指定的位数。右移时,操作数移出右边界的位被丢弃,从左边开始用 符号位
填补空位。如果原来最高位是1,则填补1;如果是0,则填补0。
使用格式:
<操作数> >> <移位位数>
例如:
int a = 16;
System.out.println(a >> 2);
分析:
16 的二进制:00000000 00000000 00000000 00010000
进行运算:
00000000 00000000 00000000 00010000
00000000 00000000 00000000 00000100(00)
结果:4
不带符号右移位运算符
不带符号右移位运算符是 >>>
,它是双目运算符,功能是将 >>>
左边的操作数的各个二进制位全部右移指定的位数。右移时,操作数移出右边界的位被丢弃,从左边开始用 0
填补空位。
使用格式:
<操作数> >>> <移位位数>
例如:
int a = 16;
System.out.println(a >>> 2);
分析:
16 的二进制:00000000 00000000 00000000 00010000
进行运算:
00000000 00000000 00000000 00010000
00000000 00000000 00000000 00000100(00)
结果:4
赋值运算符
Java 中的赋值运算符有两种,一种是简单的赋值运算符 =
,;另外一种是将 =
与其他的运算符复合在一起形成的复合赋值运算符。
简单赋值运算符
赋值运算符为 =
,它是双目运算符,它不等同于数学中的等号。由赋值运算符连接的表达式,称为赋值表达式。
使用格式:
<变量> = <exp>
在 Java 中,出现在赋值运算符左边的操作数被称为 “左值”,出现在赋值运算符右边的操作数被称为 “右值”。常量和表达式不能作为 “左值”。
复合赋值运算符
为了避免对同一存储对象的地址重复计算,提高编译效率,Java 引入了复合赋值运算符。Java 提供了 11 种复合赋值运算符,它们分别是:+=、-=、*=、/=、%=、<<=、>>=、>>>=、&=、|=、^=。
例如:
x += 6.0 等价于 x = x + 6.0
z *= z + y 等价于 z = z * (x + y)
a += a -= b + 5 等价于 a = a + (a = a - (b + 5))
其他运算符
条件运算符
条件运算符同样也被称作为三元运算符,它是三目运算符。这种运算符由三个操作数组成,被用作评估布尔数学体系表达。这种运算符的目的是来决定哪些值应被赋予到变量上。
使用格式:
<exp1> ? <exp2> : <exp3>
运算规则:首先计算 exp1,当其结果为 true 时,条件运算表达式取 exp2 的值作为整个表达式的值,否则取 exp3 的值作为整个表达式的值。
例如:
public class Test {
public static void main(String args[]){
int a , b;
a = 10;
b = (a == 1) ? 20: 30;
System.out.println( "Value of b is : " + b );
b = (a == 10) ? 20: 30;
System.out.println( "Value of b is : " + b );
}
}
结果如下:
Value of b is : 30
Value of b is : 20
instanceof 运算符
instanceof 操作符只用于对象引用变量,其功能是检查对象是否是独特类型(类型或接口类型)。如果在运算符左侧的由变量所指代的对象为右侧的类型或接口类型通过 IS-A 检查,那么结果为真。
使用格式:
(Object reference variable) instanceof (class/interface type)
例如:
public class Test {
public static void main(String args[]){
String name = "James";
// following will return true since name is type of String
boolean result = name instanceof String;
System.out.println(result);
}
}
结果为:
true