Java 运算符
运算符是一些特殊的符号,它们对一个,两个或多个操作数执行特定的运算,然后返回一个结果。这里的操作数指的就是运算符操作的实体。
Java
提供了一组丰富的运算符来操作变量。 我们可以将所有Java运算符分为以下几类:
- 算术运算符
- 关系运算符
- 位运算符
- 逻辑运算符
- 赋值运算符
- 其他运算符
算术运算符
概述
Java 语言提供了执行加减乘除四则运算的运算符。 算数运算符被用在数学表达式中,可以使用任意嵌套的小括号,其作用与数学中相同。下表列出了算术运算符:
(在例子中,初始化两个整型变量a、b:int a = 2; int b = 4;
)
实例
以下是算数运算符的实例程序。
加法运算符使用实例:
1 | public class ArithmeticOperators1 { |
运行结果:
1 | 2 + 3 = 5 |
减法运算符使用实例:
1 | public class ArithmeticOperators2 { |
运行结果:
1 | 5 + 3 = 8 |
乘法运算符使用实例:
1 | public class ArithmeticOperators3 { |
运行结果:
1 | 2 x 5 = 10 |
除法运算符使用实例:
1 | public class ArithmeticOperators4 { |
运行结果:
1 | 10 / 2 = 5 |
取余运算符使用实例:
1 | public class ArithmeticOperators5 { |
编译执行代码,屏幕上将会打印:
1 | 5 % 2 = 1 |
自增、自减运算符使用实例:
1 | public class ArithmeticOperators6 { |
运行结果:
1 | num1=5 |
另外,整型之间的除法运算是整除,这也就意味着2 / 4
的结果为0
,如果我们想像数学一样得到一个小数,可以使用浮点类型的操作数。例如:
1 | public class OperatorDemo1 { |
运行结果:
1 | 整型2除以整型4的结果为:0 |
要特别注意,在 Java 语言中,算数运算符不能作用于不同类型的操作数。我们来看一个反例:
1 | public class OperatorDemo1 { |
编译代码,将会报错:
1 | javac OperatorDemo1.java |
编译器给出明确提示:加法运算符的操作数类型错误。这是因为 Java 是强类型的语言,不同类型的操作数的算数运算是违规的,这个原理同样适用于其他算数运算符,此处不再一一列举。
还有一点,自增自减运算符是有前后之分的,++i表示先加1再引用i,i++表示先引用i再加1。将在下一小节举例介绍。
关系运算符
概述
关系运算符又称为比较运算符,比较的结果是一个布尔类型的值(true
或false
)。
Java 语言有几个可用于比较变量的运算符,如下表所示:
(在例子中,初始化两个整型变量a、b:int a = 2
; int b = 4
;)
实例
下面是一个比较运算符的实例程序:
1 | public class OperateDemo2 { |
运行结果:
1 | id == i1的结果为:true |
Tips:
>
、<
、>=
、<=
这几个运算符左右两边的操作数必须是byte
,short
,int
,long
,double
,float
,char
这几种数据类型;而==和!=运算符的操作数既可以是基本数据类型,又可以是引用数据类型。
位运算符
Java 语言还提供了对整数类型执行按位和移位操作的运算符,称作位运算符。
它在实际的编码中并不常用,这部分内容了解即可。
假设a = 60,b = 13
;它们的二进制格式表示将如下:
1 | a = 0011 1100 |
下表列出了位运算符的基本运算,假设整数变量 a 的值为 60 和变量 b 的值为 13:
逻辑运算符
概述
逻辑运算符可以在表达式中生成组合条件,例如在执行特定语句块之前必须满足的两个或多个条件。使用逻辑运算符,可以描述这些组合条件。逻辑运算的返回结果只能为真或假。
Java 语言中的逻辑运算符,如下表所示:
(在例子中,初始化两个整型变量a、b:int a = 0
; int b = 1
;)
短路运算
&&
和||
运算符存在短路行为。短路的意思是:只有在需要的时候才会判断第二个操作数的真假。例如:
1 | class LogicOperators { |
运行结果:
1 | a等于1或b等于1 |
程序解析:有两个整型变量a
和b
,值分别为1
和2
。第一个if
语句的条件为逻辑与运算,其第一个操作数a == 2
为假,所以无论第二个操作数是真是假,都不去判断,条件直接被判定为假;第二个if
语句的条件为逻辑或运算, 其第一个操作数a == 1
为真,所以无论第二个操作数是真是假,都不会去判断,条件直接被判定为真。这就是所谓的短路。
赋值运算符
概述
赋值运算符是为指定变量分配值的符号。下标列出了常用 Java 中常用的赋值运算符:
实例
我们来看一个赋值运算符的实例:
1 | public class OperateDemo5 { |
运行结果:
1 | 初始值: |
其他运算符
条件运算符(? :)
条件运算符也称为三元运算符。我们会在条件语句小节中再次对其介绍。
该运算符由三个操作数组成,用于判断布尔表达式。它的目的是确定应将哪个值分配给变量。条件运算符的语法为:
1 | public class ConditionalOperators { |
由于age
变量值为15
,小于18
,age >= 18
返回结果为假,因此编译执行后,屏幕将打印:
1 | 在中国你还未成年 |
instanceof 运算符
Tips:了解
instanceof
运算符需要一些面向对象的前置知识。目前你可以选择性学习。
instanceof
运算符将对象与指定类型进行比较,检查对象是否是一个特定类型(类类型或接口类型)。
instanceof
运算符的语法为:
1 | ( Object reference variable ) instanceof (class/interface type) |
如果instanceof
左侧的变量所指向的对象,是instanceof
右侧类或接口的一个对象,结果为真,否则结果为假。
1 | public class InstanceOfOperators1 { |
由于字符串变量name
是String
类型,所以执行代码,屏幕会打印:
1 | 结果为:true |
注意,instanceof
运算符不能用于操作基本数据类型,如果将字符串类型name
变量改为一个char
类型的变量,编译代码将会报错:
1 | InstanceOfOperators1.java:4: 错误: 意外的类型 |
运算符的优先级
当多种运算符在一同使用的时候,会有一个执行先后顺序的问题。
下表中的运算符按优先顺序排序。运算符越靠近表格顶部,其优先级越高。具有较高优先级的运算符将在具有相对较低优先级的运算符之前计算。同一行上的运算符具有相同的优先级。
|—|—|
|类别 |操作符 |关联性|
后缀 |() [] . (点操作符)| 左到右
一元 |+ + - !〜 |从右到左
乘性 |* /% |左到右
加性 |+ - |左到右
移位 |>> >>> << |左到右
关系 |>> = << = |左到右
相等 |== != |左到右
按位与 |& |左到右
按位异或 |^ 左到右
按位或 ||| 左到右
逻辑与 |&& |左到右
逻辑或 || || 左到右
条件 |?: |从右到左
赋值 |= + = - = * = / =%= >> = << =&= ^ = | = |从右到左
逗号| , |左到右
当相同优先级的运算符出现在同一表达式中时,如何控制它们计算的先后呢。我们来看一个实例:
1 | public class OperateorsPriority { |
在计算result
的语句的右侧,+ 、-
两个运算符优先级相同,如果我们不加以控制,将按照从左到右顺序计算,打印结果为result = 2
;但是如果我们想先计算a + b
和c + a
的值,再计算两者之差,我们可以使用括号()将其顺序进行控制:(a + b) - (c + a)
,再执行代码将打印我们想要的结果:result = -2
。