一、算术运算符
+ | 正号 |
- | 负号 |
+ | 加法 |
- | 减法 |
* | 乘法 |
/ | 除法 |
% | 模运算(取余) |
++ | 自增 |
-- | 自减 |
算术运算符的使用比较简单,只需要注意一些细节。
tips:
- 加号( '+' )除了可以作为正号,还可以用于字符串拼接。
public class Plus{public static void main(String[] args){//加号可以将其他基本数据类型转换为StringString str = 1234567 + "";System.out.println(str);//加号可以拼接字符串String str1 = "hello ";System.out.println(str1 + "world");}}
- 取模运算
public class Mod{public static void main(String[] args){//取模运算符演示//取模运算符的右侧不能为0//取模运算符可以对正整数、负整数或浮点数使用//取模运算就是求除法运算的余数int n1 = 20 % 5;int n2 = -20 % 6;int n3 = 20 % -3;int n4 = -20 % -7;double n5 = 3.3 % 1.1;System.out.println(n1);System.out.println(n2);System.out.println(n3);System.out.println(n4);System.out.println(n5);}}
-
自增(自减):自增和自减运算符使用方法一致,下面介绍自增运算符。
public class PlusPlus{public static void main(String[] args){//x++或++x对x变量来说等价于 x = x + 1;并且自增运算符会将结果//自动转换成x对应的类型以便赋给x////前置++//表示先将变量的值+1,再返回变量值int x = 1;System.out.println(++x);System.out.println(x);//后置++//先使用一个临时变量保存x的值,再将x值+1,然后返回临时变量保存的值x = 1;System.out.println(x++);System.out.println(x);//对于式子 x = x++ 和 x = ++x,Java是有确定结果的,而C语言中是未定义行为x = 1;x = x++;//先使用一个临时变量保存x的值,再将x值+1,然后返回临时变量保存的值给x,所以x值不变System.out.println(x);x = ++x;//先将x值+1,然后返回自增后的值给x,这个式子就等同于x++;System.out.println(x);}}
二、关系运算符
== | 等于 |
!= | 不等于 |
< | 小于 |
> | 大于 |
<= | 小于等于 |
>= | 大于等于 |
instanceof | 是否为类对象 |
关系运算符的使用与数学中一致,含有关系运算符的表达式为关系表达式,其运算结果为boolean类型。
三、 逻辑运算符
&& | 逻辑与(短路与) |
|| | 逻辑或(短路或) |
! | 逻辑非 |
public class LogicOperation{public static void main(String[] args){//&&,当两边都为真时,表达式为真,否则为假//并且如果左侧表达式为假,那么不会再判断右侧表达式,直接输出假(这个现象称为短路)System.out.println(1 == 1 && 2 == 2);System.out.println(1 == 1 && 2 == 3);int a = 1;System.out.println(1 == 2 && a++ == 2);System.out.println(a);System.out.println("--------------------");//||,当两边的表达式至少一个为真时,结果为真//逻辑或也有短路现象System.out.println(1 == 2 || 2 == 3);System.out.println(1 == 1 || 2 == 3);a = 1;System.out.println(1 == 1 || a++ == 2);System.out.println(a);System.out.println("--------------------");//!,假变真,真变假System.out.println(!(1 == 2));System.out.println(!(1 == 1));}}
四、赋值运算符
基本赋值运算符 | = |
复合赋值运算符 | += |
-= | |
*= | |
/= | |
%=等 |
赋值运算符的作用就是将赋值运算符右侧的表达式的结果赋给左侧的变量。
public class AssignOperation{public static void main(String[] args){//复合赋值运算符的基本用法相同,拿+=来举例//x += 1;就相当于 x = x + 1;//使用复合赋值运算符更加简洁,并且复合赋值运算符可以自动转换类型byte x = 1;//x = x + 1;//这种写法会报错,因为右边表达式的结果为int类型x += 1;//这样就不会报错}}
五、移位运算符
& | 按位与 |
| | 按位或 |
~ | 按位取反 |
^ | 按位异或 |
>> | 算术右移 |
<< | 算术左移 |
>>> | 逻辑右移 |
- 按位与、按位或:可以用于条件表达式,但没有短路现象,还可以对数值类型进行按位操作。
- 按位取反:将相应数值的二进制表示中1变为0,0变为1.
- 算术左移:将二进制所有位向左移动 x 位,符号位不变,低位补0.
- 算术右移:将二进制所有位向右移动 x 位,高位补符号位。
- 逻辑右移:右移 x 位,高位补0.
public class BitOperation{public static void main(String[] args){//&//用于条件表达式不会短路System.out.println("下面是按位与 & ");System.out.println("-------------------------------");int x = 1;System.out.println(1 == 2 & x++ == 1);System.out.println(x);//1的二进制表示后八位为0000001,3为00000011//所以1 & 3 = 1//任何数&0都为0System.out.println(1 & 3);System.out.println("-------------------------------");System.out.println("下面是按位或 | ");System.out.println("-------------------------------");//|//用于条件表达式不会短路x = 1;System.out.println(1 == 1 | x++ == 1);System.out.println(x);//1 | 3 = 3//|0都为自己System.out.println(1 | 3);System.out.println("-------------------------------");System.out.println("下面是按位取反 ~ ");System.out.println("-------------------------------");//~,对二进制位按位取反//-1 的二进制表示为 11111111 11111111 11111111 11111111//按位取反的结果为0System.out.println(~(-1));System.out.println("-------------------------------");System.out.println("下面是按位异或 ^ ");System.out.println("-------------------------------");//对每个bit进行操作,相同为0,相异为1//1 ^ 3 = 2//任何数^0为自己System.out.println(1 ^ 3);System.out.println("-------------------------------");System.out.println("下面是算数右移 >> ");System.out.println("-------------------------------");//算术右移一次相当于 / 2//所以4 >> 2 = 1,-5 >> 2 = -2System.out.println(4 >> 2);System.out.println(-5 >> 2);System.out.println("-------------------------------");System.out.println("下面是算数左移 << ");System.out.println("-------------------------------");//算术右移一次相当于 * 2//所以4 << 2 = 16,-5 << 2 = -20System.out.println(4 << 2);System.out.println(-5 << 2);System.out.println("-------------------------------");System.out.println("下面是逻辑右移 >>> ");System.out.println("-------------------------------");//逻辑右移高位补0,不补符号位,所以负数逻辑右移可能会变为正数//-1 >>> 1 = 2147483647System.out.println(-1 >>> 1);}}
六、三目运算符
public class ThreeOperation{public static void main(String[] args){//三目运算符的语法为:条件表达式?表达式1:表达式2//如果条件表达式为真,则返回表达式1的结果,否则返回表达式2的结果//System.out.println(1 == 2 ? "1 == 2" : "1 != 2");System.out.println(1 == 1 ? "1 == 1" : "1 != 1");}}
七、运算符优先级
优先级 | 运算符 | 结合性(指遇到同优先级运算符的怎样结合成子表达式) |
1 | () {} . | 从左到右 |
2 | ++ -- ! ~ | 从右到左 |
3 | * / % | 从左到右 |
4 | + - | 从左到右 |
5 | << >> >>> | 从左到右 |
6 | < > <= >= instanceof | 从左到右 |
7 | == != | 从左到右 |
8 | & | 从左到右 |
9 | ^ | 从左到右 |
10 | | | 从左到右 |
11 | && | 从左到右 |
12 | || | 从左到右 |
13 | ?: | 从右到左 |
14 | 赋值运算符 | 从右到左 |
15 | 逗号运算符 | 从左到右 |
只有三目运算符、单目运算符和赋值运算符的结合性是从右向左,其余运算符的结合性都是从左向右。
下面举个例子来说明运算符结合性的意思:
//有一个三目运算符的表达式
// a ? b : c ? d : e;
//从右向左结合并不意味着 c ? d : e是优先计算的
//而是意味着这个表达式等价于 a ? b : (c ? d : e);
//而不等价于 (a ? b : c) ? d : e;
八、标识符
在Java中,对变量、方法和类等命名时使用的字符序列称为标识符。
标识符的命名规则:
- 由字母、数字、下划线或 $ 符号组成;
- 数字不可以开头;
- 不能使用关键字或保留字
- Java中严格区分大小写,对长度没有限制;
- 标识符中不能有空格。
标识符的命名规范可以查看阿里巴巴的Java开发手册。
关键字:在Java中用于特殊用途的字符序列,可以看作是特殊的标识符。
保留字:目前还没有使用,但未来可能作为关键字使用。