Java的表达式由标识符、关键字、常量、运算符、变量等元素构成,对这些元素执行运算并返回某个值。表达式可用于对变量赋值,也可以作为程序控制的条件。
表达式的运算按运算符的功能分类,可分为以下几类:
算术运算
算术运算是对数字数据进行操作。可再分为:
一元运算
运算符 | 用法 | 描述 |
+ | +op | 取正 |
- | -op | 取负 |
++ | ++op或op++ | 加1 |
-- | --op或op-- | 减1 |
++op(--op)是先令op加1(减1),再求表达式的值;op++(op--)是先求表达式的值,再令op加1(减1)。
二元运算
运算符 | 用法 | 描述 |
+ | op1+op2 | 加 |
- | op1-op2 | 减 |
* | op1*op2 | 乘 |
/ | op1/op2 | 除 |
% | op1%op2 | 求模 |
若两个操作数都是整数,则结果是一个整数;若其中一个操作数为浮点数,则结果为浮点数。
关系运算
关系运算是两个操作数间的比较,返回结果是一个布尔值,可用于逻辑判断。
运算符 | 用法 | 描述 |
< | op1<op2 | 小于 |
> | op1>op2 | 大于 |
<= | op1<=op2 | 小于等于 |
>= | op1>=op2 | 大于等于 |
== | op1==op2 | 等于 |
!= | op1!=op2 | 不等于 |
布尔逻辑运算
布尔逻辑运算用于对布尔型数据进行运算。
运算符 | 用法 | 描述 |
&& | op1&&op2 | 逻辑与 |
|| | op1||op2 | 逻辑或 |
! | !op | 逻辑非 |
对于逻辑与运算,若op1为false,则不会对op2进行运算;对于逻辑或运算,若op1位true,则不会对op2进行运算。
位运算
位运算用于对整数进行二进制位进行操作。
运算符 | 用法 | 描述 |
~ | ~op | 按位取反 |
& | op1&op2 | 按位与 |
| | op1|op2 | 按位或 |
^ | op1^op2 | 按位异或 |
<< | op1<<op2 | 左移 |
>> | op1>>op2 | 带符号数右移 |
>>> | op1>>>op2 | 无符号数右移 |
若操作数的类型为byte型、short型或int型,则位运算的结果为int型;若操作数类型为long型,则位运算的结果为long型。
按位取反、按位与、按位或、按位异或运算可以用于布尔型数据,与逻辑运算不同的是,位运算需要对op1和op2都进行运算,最后再进行位运算。
条件运算
条件运算使用一个三元运算符(?:),用法为:expression ? op1 : op2(op1和op2的类型要一致)。表示若expression的布尔值为true,则对op1进行运算,否则对op2进行运算。
类型转换运算
类型转换运算是把某种类型的数据转换为另一种类型的数据,用法为:(type) op。
位数少的数据转换为位数多的数据不会造成信息丢失,而位数多的数据转换为位数少的数据则会导致丢失信息或精度下降。
assert运算
assert运算用于断言,格式为:assert expression [: msg]。
若expression为true则继续执行之后的程序,否则抛出AssertionError错误,可以指定错误信息msg。
instanceof运算
instanceof运算用于判断对象的类型,返回布尔值,格式为:obj instanceof type。
obj为一个引用类型对象,type必须为obj类型的父类或子类。
new运算
new运算用于对象的实例化和初始化。格式为:new constructor。
constructor是对应类的构造方法。
测试
一元运算
y=++x和y=x++的区别。
1 @Test 2 void testUanry() { 3 int x, y; 4 x = y = 0; 5 y = ++x; // 等同于 x = x + 1; y = x; 6 System.out.println("y = ++x = " + y); 7 System.out.println("x = " + x); 8 System.out.println(); 9 x = y = 0; 10 y = x++; // 等同于 y = x; x = x + 1; 11 System.out.println("y = x++ = " + y); 12 System.out.println("x = " + x); 13 }
输出结果:
二元运算
两个整数的运算和一个整数、一个浮点数的运算。
1 @Test 2 void testBinary() { 3 int a = 11; 4 int b = 2; 5 System.out.println(a + " / " + b + " = " + (a / b)); 6 float c = 2.0f; 7 System.out.println(a + " / " + c + " = " + (a / c)); 8 }
输出结果:
布尔型数据的逻辑运算和位运算
逻辑与运算与按位与运算的区别。
1 @Test 2 void testLogicVSBitwise() { 3 int x = 1; 4 System.out.println(false && (x++ > 2)); // 逻辑与运算不会执行x++ 5 System.out.println("x = " + x); 6 x = 1; 7 System.out.println(false & (x++ > 2)); // 按位与运算会执行x++ 8 System.out.println("x = " + x); 9 }
输出结果:
assert运算
1 @Test 2 void testAssert() { 3 int a = 11; 4 assert a > 10 : "a <= 10"; 5 System.out.println("a > 10"); 6 a = 10; 7 assert a > 10 : "a <= 10"; 8 System.out.println("a > 10"); 9 }
输出结果:
instanceof运算
1 @Test 2 void testInstanceof() { 3 Number i = 1.0f; 4 System.out.println(i instanceof Serializable); // 父类或父接口 5 System.out.println(i instanceof Byte); // 子类或子接口 6 System.out.println(i instanceof Float); 7 }
输出结果: