操作符
现在你已经学习了如何声明和初始化一个变量,你也许想要知道如何使用变量。学习java操作符是一个不错的开头。操作符是专门的符号,来对一个或两个或三个操作数执行专门的操作,并返回结果。
在我们研究java操作符之前,去了解操作符的优先级是有帮助的。操作符根据优先级在下表中列出。最上面的优先级最高。较高优先级操作符会比较低优先级操作符先计算。同一行的操作符优先级一样。当一个表达式中出现同样优先级的操作符,需要给出计算的规则。除了赋值操作符,所有二元操作符是从左到右计算。赋值操作符是从右到左。
操作符 | 优先级 |
后缀 | expr++ expr-- |
一元 | ++expr --expr +expr -expr ~ ! |
乘法 | * / % |
加法 | + - |
位移 | << >> >>> |
关系 | < > <= >= instanceof |
等于 | == != |
位与 | & |
位或 | | |
位异或 | ^ |
逻辑与 | && |
逻辑或 | || |
三元 | ? : |
赋值 | = += -= *= /= %= &= |= ^= >>= <<= >>>= |
通常编程中,一些操作符比另外一些操作符的使用频率更高;比如赋值操作符"="远比无符号向右位移操作符">>>"更常用。所以,下面先讨论更常使用的操作符,然后再讨论不那么常用的操作符。每一部分都伴随有可以编译执行的代码。学习代码的输出可以加强你的学习。
赋值、计算、一元操作符
简单的赋值操作符
你将碰到的最常用的一个操作符就是简单赋值操作符"="。你在Bicycle类中看到过;它把右边的值赋给左边的操作数:
int cadence = 0;
int gear = 0;
int speed = 0;
这个操作符也可以把对象赋值给对象引用。
运算操作符
java提供加减乘除操作符。你可以很容易认出它们,因为和数学里的符号是一样的。唯一例外的是"%"取模操作符,返回一个操作数除以另一个操作数剩下的值。代码:
class ArithmeticDemo{
public static void main (String[] args) {
int result = 1 + 2; // result is now 3 System.out.println("1 + 2 = " + result); int original_result = result; result = result - 1; // result is now 2 System.out.println(original_result + " - 1 = " + result); original_result = result; result = result * 2; // result is now 4 System.out.println(original_result + " * 2 = " + result); original_result = result; result = result / 2; // result is now 2 System.out.println(original_result + " / 2 = " + result); original_result = result; result = result + 8; // result is now 10 System.out.println(original_result + " + 8 = " + result); original_result = result; result = result % 7; // result is now 3 System.out.println(original_result + " % 7 = " + result); } }
输出为:
1 + 2 = 3
3 - 1 = 2
2 * 2 = 4
4 / 2 = 2
2 + 8 = 10
10 % 7 = 3
你也可以结合运算操作符和简单赋值操作符创建复合赋值。比如:x += 1; 和x = x + 1;都会把x的值加一。"+"操作符也可以用来连接两个字符串。比如下面代码:
class ConcatDemo{
public static void main(String[] args){
String f = "this is ";
String s = "a concat string";
String t = f + s;
System.out.println(t);
}
}
程序的最后,变量t包含"this is a concat string"被打印出来。
一元操作符
一元操作符只需要一个操作数;它们执行各种操作比如对变量增加1、减少1、对一个表达式取反、反转一个布尔值。
+ 一元加操作符;表示一个正值
- 一元减操作符,对表达式取负
++ 自加操作符
-- 自减操作符
! 逻辑取补操作符,反转一个布尔值
下面程序测试一元操作符:
class UnaryDemo{
public static void main(String[] args){
int result = +1;
System.out.println(result);
result--;
System.out.println(result);
result++;
System.out.println(result);
result = -result;
System.out.println(result);
boolean success = false;
System.out.println(success);
success = !success;
System.out.println(success);
}
}
自加和自减操作符可以作为操作数的前缀或后缀。代码result++和++result,result最后都会加1。唯一的区别是前缀使用加1的值计算,后缀使用未加1的值计算。如果你只是自加1前缀和后缀没有区别。但是如果是在一个大的表达式中,两者还是有区别的。
下面的例子展示了前缀和后缀一元操作符:
class PrePostDemo{
public static void main(String[] args){
int i = 3;
i++;
System.out.println(i);
++i;
System.out.println(i);
System.out.println(++i);
System.out.println(i++);
System.out.println(i);
}
}
等式、关系式、条件操作符
等式和关系式操作符
等式和关系式操作符决定一个操作数是否大于、小于、等于或不等于另一个操作数。大部分操作符看起来都很熟悉。注意,你必须使用"=="而不是"="来测试两个基础数据类型的值是否相等。
==等于
!=不等于
>大于
>=大于等于
<小于
<=小于等于
下面代码测试了比较操作符:
class ComparisonDemo{
public static void main(String[] args){
int a = 1;
int b = 2;
if(a == b){
System.out.println("a == b");
}
if(a != b){
System.out.println("a != b");
}
if(a > b){
System.out.println("a > b");
}
if(a >= b){
System.out.println("a >= b");
}
if(a < b){
System.out.println("a < b");
}
if(a <= b){
System.out.println("a <= b");
}
}
}
输出:
a != b
a < b
a <= b
条件操作符
"&&"、"||"操作符对两个布尔表达式执行条件与和条件或操作。这两个操作符执行最短路径行为,这表示第二个操作数只在需要的时候计算。
&& 条件与
|| 条件或
下面程序测试这两个操作符:
class ConditionalDemo1{
public static void main(String[] args){
int value1 = 1;
int value2 = 2;
if((value1 == 1) && (value2 == 2)){
System.out.println("value1 is 1 and value2 is 2.");
}
if((value1 == 1) || (value2 ==1)){
System.out.println("value1 is 1 or value2 is 1.");
}
}
}
另外一个条件操作符是?:,可以被认为是if-then-else语句的速写法。这个操作符是三元操作符,因为它有三个操作数。下面的例子中,这个操作符可以被解读为:如果条件是真,则把value1赋给result,否则,把value2赋给result。
class ConditionalDemo2{
public static void main(String[] args){
int value1 = 1;
int value2 = 2;
int result;
boolean someCondition = true;
result = someCondition ? value1 : value2;
System.out.println(result);
}
}
因为someCondition为真,所以程序打印1。使用?:替换if-then-else如果能让你的代码可读性更高,比如当这个表达式比较紧凑并且没有副作用(好像赋值)。
类型比较操作符instanceof
instanceof操作符比较一个对象是否属于某一个类型。你可以用它来测试一个对象是否是一个类的实例、一个子类的实例或者是一个实现某个接口的类的实例。
下面代码,定义一个父类,一个接口,一个子类,子类继承了父类并实现了接口。
class Parent{}
interface MyInterface{}
class Child extends Parent implements MyInterface{}
class InstanceofDemo{
public static void main(String[] args){
Parent obj1 = new Parent();
Parent obj2 = new Child();
System.out.println(obj1 instanceof Parent);//true
System.out.println(obj1 instanceof Child);//false
System.out.println(obj1 instanceof MyInterface);//false
System.out.println(obj2 instanceof Parent);//true
System.out.println(obj2 instanceof Child);//true
System.out.println(obj2 instanceof MyInterface);//true
}
}
使用instanceof操作符时注意,null不属于任何一个类型。
按位和位移操作符
java对整数类型也提供了按位和位移操作符。本节讨论的操作符并不那么常见。因此会讲解的比较简单,只是让你知道这些操作符的存在。
一元按位取补操作符"~"会按位模式反转。它可以应用于任何整数类型,把每一个"0"变成"1",每一个"1"变成"0"。比如一个字节有8位,使用这个操作符,它的位模式本来是"00000000",则会变成"11111111"。
有符号的左位移操作符"<<"按位模式向左移动,有符号的右位移操作符">>"按位模式向右移动。需要位移的数在符号的左边,移动位置的个数在符号的右边。无符号的右位移操作符">>>"位移后,最左边补0,而有符合右位移则根据符号补充。
按位与操作符"&"执行按位与操作。
按位异或操作符"^"执行异或操作。
按位或操作符"|"执行或操作。
例子代码如下:
class BitDemo{
public static void main(String[] args){
int a = 0x000F;
int b = 0x2222;
System.out.println(a & b);
}
}
操作符总结
下面的快速参考总结了java支持的操作符。
简单赋值操作符
= 简单赋值操作符
运算操作符
+ 加法操作符(也是字符串的连接符)
- 减法操作符
* 乘法操作符
/ 除法操作符
% 取模操作符
一元操作符
+ 一元加操作符;表示一个正数
- 一元减操作符;取反一个表达式
++ 增量操作符,给值加1
-- 减量操作符,给值减1
! 逻辑求补操作符,给布尔型取反
等式和关系式操作符
= 等于
!= 不等于
> 大于
>= 大于等于
< 小于
<= 小于等于
条件操作符
&& 条件与
|| 条件或
?: 三元表达式
类型比较操作符
instanceof 比较一个对象是否是某一类型的
按位和位移操作符
~ 一元按位取补
<< 有符合左位移
>> 有符合右位移
>>> 无符号右位移
& 按位与
| 按位或
^ 按位异或