既然你已经学会了如何声明和初始化变量,那么你可能想知道如何使用它们,学习Java编程语言的运算符是一个很好的起点,运算符是对一个、两个或三个操做数执行特定运算的特殊符号,而后返回结果。编程
在咱们探索Java编程语言的运算符时,提早知道哪些运算符具备最高优先级可能会对你有所帮助,下表中的运算符按优先顺序列出,运算符出如今离表顶部越近,其优先级越高,优先级较高的运算符在优先级相对较低的运算符以前进行求值。同一行上的运算符具备相同的优先权,当具备相同优先级的运算符出如今同一表达式中时,规则必须控制首先计算的值,除了赋值运算符以外的全部二元运算符都是从左到右计算的,赋值运算符从右到左进行求值。segmentfault
运算符 | 优先级 |
---|---|
后缀 | expr++ expr-- |
一元 | ++expr --expr +expr -expr ~ ! |
乘法 | * / % |
加法 | + - |
位移 | << >> >>> |
关系 | < > <= >= instanceof |
等于 | == != |
按位与 | & |
按位异或 | ^ |
按位或 | | |
逻辑与 | && |
逻辑或 | || |
三元 | ? : |
赋值 | = += -= *= /= %= &= ^= |= <<= >>= >>>= |
在通用编程中,某些运算符每每比其余运算符更频繁地出现,例如,赋值运算符“=
”比无符号右移运算符“>>>
”更常见,考虑到这一点,如下讨论首先关注你最有可能常用的运算符,并最终关注那些不太常见的运算符。每一个讨论都附带能够编译和运行的示例代码,研究它的输出将有助于增强你刚刚学到的东西。编程语言
你将遇到的最多见的运算符之一是简单赋值运算符“=
”,你在Bicycle
类中看到了此运算符,它将右侧的值赋给左侧的操做数:学习
int cadence = 0; int speed = 0; int gear = 1;
此运算符也可用于对象以分配对象引用,如建立对象中所述。测试
Java编程语言提供执行加法,减法,乘法和除法的运算符,颇有可能你会被基础数学方面的同行认出来,惟一可能看起来很新的符号是“%
”,它将一个操做数除以另外一个操做数,并将余数做为结果返回。code
运算符 | 描述 |
---|---|
+ | 加法运算符(也用于字符串链接) |
- | 减法运算符 |
* | 乘法运算符 |
/ | 除法运算符 |
% | 取余运算符 |
如下程序ArithmeticDemo
测试算术运算符。对象
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的值递增1。接口
+
运算符也可用于将两个字符串链接(链接)在一块儿,以下面的ConcatDemo
程序所示:字符串
class ConcatDemo { public static void main(String[] args){ String firstString = "This is"; String secondString = " a concatenated string."; String thirdString = firstString+secondString; System.out.println(thirdString); } }
在该程序结束时,变量thirdString
包含“This is a concatenated string.”,它被打印到标准输出。
一元运算符只须要一个操做数,它们执行各类操做,例如将值递增/递减1,否认表达式或反转布尔值。
运算符 | 描述 |
---|---|
+ | 一元加运算符,表示正值(可是没有这个,数字也是正数) |
- | 一元减运算符,否认表达式 |
++ | 增量运算符,将值递增1 |
-- | 递减运算符,将值减1 |
! | 逻辑补码运算符,反转布尔值 |
如下程序UnaryDemo
测试一元运算符:
class UnaryDemo { public static void main(String[] args) { int result = +1; // result is now 1 System.out.println(result); result--; // result is now 0 System.out.println(result); result++; // result is now 1 System.out.println(result); result = -result; // result is now -1 System.out.println(result); boolean success = false; // false System.out.println(success); // true System.out.println(!success); } }
能够在操做数以前(前缀)或以后(后缀)应用递增/递减运算符,代码result++;
和++result;
将两个结果都加1。惟一的区别是前缀版本(++result
)评估为增量值,然后缀版本(result++
)评估为原始值。若是你只是执行简单的增量/减量,那么选择哪一个版本并不重要,可是,若是你在较大的表达式中使用此运算符,则你选择的运算符可能会产生显着差别。
如下程序PrePostDemo
演示了前缀/后缀一元增量运算符:
class PrePostDemo { public static void main(String[] args){ int i = 3; i++; // prints 4 System.out.println(i); ++i; // prints 5 System.out.println(i); // prints 6 System.out.println(++i); // prints 6 System.out.println(i++); // prints 7 System.out.println(i); } }
等于和关系运算符肯定一个操做数是否大于,小于,等于或不等于另外一个操做数,这些运算符中的大多数也可能看起来很熟悉,请记住,在测试两个原始值是否相等时,必须使用“==
”而不是“=
”。
运算符 | 描述 |
---|---|
== | 等于 |
!= | 不等于 |
> | 大于 |
>= | 大于或等于 |
< | 小于 |
<= | 小于或等于 |
如下程序ComparisonDemo
测试比较运算符:
class ComparisonDemo { public static void main(String[] args){ int value1 = 1; int value2 = 2; if(value1 == value2) System.out.println("value1 == value2"); if(value1 != value2) System.out.println("value1 != value2"); if(value1 > value2) System.out.println("value1 > value2"); if(value1 < value2) System.out.println("value1 < value2"); if(value1 <= value2) System.out.println("value1 <= value2"); } }
输出:
value1 != value2 value1 < value2 value1 <= value2
&&
和||
运算符对两个布尔表达式执行条件与和条件或运算,这些运算符表现出“最少运算”行为,这意味着仅在须要时才评估第二个操做数。
运算符 | 描述 |
---|---|
&& | 条件与 |
|| | 条件或 |
如下程序ConditionalDemo1
测试这些运算符:
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
语句的简写(在本课程的控制流语句部分中讨论),此运算符也称为三元运算符,由于它使用三个操做数,在如下示例中,应将此运算符读做:“若是someCondition
为true
,则将value1
的值赋给result
,不然,将value2
的值赋给result
。”
如下程序ConditionalDemo2
测试?:
运算符:
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
为true
,因此此程序在屏幕上打印“1”,若是它使代码更具可读性,请使用?:
运算符而不是if-then-else
语句,例如,当表达式紧凑且没有反作用(例如赋值)时。
instanceof
运算符将对象与指定的类型进行比较,你可使用它来测试对象是不是类的实例,子类的实例或实现特定接口的类的实例。
如下程序InstanceofDemo
定义了一个父类(名为Parent
),一个简单的接口(名为MyInterface
)和一个继承自父类并实现接口的子类(名为Child
)。
class InstanceofDemo { public static void main(String[] args) { Parent obj1 = new Parent(); Parent obj2 = new Child(); System.out.println("obj1 instanceof Parent: " + (obj1 instanceof Parent)); System.out.println("obj1 instanceof Child: " + (obj1 instanceof Child)); System.out.println("obj1 instanceof MyInterface: " + (obj1 instanceof MyInterface)); System.out.println("obj2 instanceof Parent: " + (obj2 instanceof Parent)); System.out.println("obj2 instanceof Child: " + (obj2 instanceof Child)); System.out.println("obj2 instanceof MyInterface: " + (obj2 instanceof MyInterface)); } } class Parent {} class Child extends Parent implements MyInterface {} interface MyInterface {}
输出:
obj1 instanceof Parent: true obj1 instanceof Child: false obj1 instanceof MyInterface: false obj2 instanceof Parent: true obj2 instanceof Child: true obj2 instanceof MyInterface: true
使用instanceof
运算符时,请记住null
不是任何实例。
Java编程语言还提供对整数类型执行按位和位移操做的运算符,本节中讨论的运算符不太经常使用,所以,他们的报道很简短,目的是让你意识到这些运算符的存在。
一元按位补码运算符“〜
”反转位模式,它能够应用于任何整数类型,使每一个“0”为“1”,每一个“1”为“0”,例如,一个字节包含8位,将此运算符应用于位模式为“00000000”的值会将其模式更改成“11111111”。
带符号的左移运算符“<<
”将位模式向左移位,带符号的右移运算符“>>
”将位模式向右移位,位模式由左侧操做数给出,以及由右侧操做数移位的位置数。无符号右移运算符“>>>
”将零移动到最左侧位置,而“>>
”以后的最左侧位置取决于符号扩展。
按位&
运算符执行按位与运算。
按位^
运算符执行按位异或运算。
按位|
运算符执行按位或运算。
如下程序BitDemo
使用按位与运算符将数字“2”打印到标准输出。
class BitDemo { public static void main(String[] args) { int bitmask = 0x000F; int val = 0x2222; // prints "2" System.out.println(val & bitmask); } }
如下快速参考总结了Java编程语言支持的运算符。
= | 简单赋值运算符 |
+ | 加法运算符(也用于字符串链接) |
- | 减法运算符 |
* | 乘法运算符 |
/ | 除法运算符 |
% | 取余运算符 |
+ | 一元加运算符,表示正值(可是没有这个,数字也是正数) |
- | 一元减运算符,否认表达式 |
++ | 增量运算符,将值递增1 |
-- | 递减运算符,将值减1 |
! | 逻辑补码运算符,反转布尔值 |
== | 等于 |
!= | 不等于 |
> | 大于 |
>= | 大于或等于 |
< | 小于 |
<= | 小于或等于 |
&& | 条件与 |
|| | 条件或 |
?: | 三元(简写的if-then-else语句) |
instanceof | 将对象与指定类型进行比较 |
~ | 一元按位补码 |
<< | 带符号左移 |
>> | 带符号右移 |
>>> | 无符号右移 |
& | 按位与 |
^ | 按位异或 |
| | 按位或 |