![Java核心编程](https://wfqqreader-1252317822.image.myqcloud.com/cover/463/34752463/b_34752463.jpg)
2.2 运算符
如果你具有其他语言(比如C语言)的编程经验,对于表2-2所总结的Java运算符的优先级应该并不陌生。所有的编程语言都有类似的运算符以支持运算。
表2-2 运算符优先级
![](https://epubservercos.yuewen.com/7C97BD/18562448808360806/epubprivate/OEBPS/Images/Figure-T50_54559.jpg?sign=1739076553-QP3PD0CiTri3e3WlsuLgIxKs1erdChMH-0-ad4fb2d37ef14d47d22e4718e080b3e6)
在表2-2中,靠近表顶部的运算符优先级最高。具有较高优先级的运算符在相对较低的优先级的运算符之前被评估。在同一行上的运算符具有相同的优先级。当在相同的表达式中出现相同优先级的运算符时,必须首先对该规则进行评估。除了赋值运算符外,所有二进制运算符进行评估时都是从左到右,赋值操作符都是从右到左。
2.2.1 赋值运算符
最常用和最简单的运算符就是赋值运算符=,用法如下:
int cadence = 0; int speed = 0; int gear = 1;
该运算符也用于对象的引用关联。
2.2.2 算术运算符
算术运算符如表2-3所示。
表2-3 算术运算符
![](https://epubservercos.yuewen.com/7C97BD/18562448808360806/epubprivate/OEBPS/Images/Figure-T51_54563.jpg?sign=1739076553-tYHBRZH8jmq3GBuKQcoIQBcBP8cDznmD-0-d5c7c33797278494f3d06769eb2b4d97)
以下是算术运算符的一些示例:
![](https://epubservercos.yuewen.com/7C97BD/18562448808360806/epubprivate/OEBPS/Images/Figure-P51_54564.jpg?sign=1739076553-KE7IZzf3Vc9aHRbT1U0lkNRDEsyRfnYi-0-b03c243ba0ea313796274cb788651bba)
输出为:
1 + 2 = 3 3 - 1 = 2 2 * 2 = 4 4 / 2 = 2 2 + 8 = 10 10 % 7 = 3
需要注意的是,“+”除了用于算术运算外,还可以用于字符串连接。以下是一个字符串连接的例子:
![](https://epubservercos.yuewen.com/7C97BD/18562448808360806/epubprivate/OEBPS/Images/Figure-P52_54566.jpg?sign=1739076553-K0TUCNok0DofA8M6LU7V7Vwc2hNwI8BT-0-f6281057f9da2164159164a1a17299eb)
输出为:
Hello World!
2.2.3 一元运算符
一元运算符只需要一个操作数,如表2-4所示。
表2-4 一元运算符
![](https://epubservercos.yuewen.com/7C97BD/18562448808360806/epubprivate/OEBPS/Images/Figure-T53_54569.jpg?sign=1739076553-XEzi94s69S1Hysgtt06IaNjiRh46OHBT-0-167471b51a378c4bceee46c1f3ade5eb)
下面是一元运算符的一些示例:
![](https://epubservercos.yuewen.com/7C97BD/18562448808360806/epubprivate/OEBPS/Images/Figure-P53_54570.jpg?sign=1739076553-00W7gib1JgOvLIeyPtjbkXBMa69jggDd-0-89dc1d91e7690dbf424b94822f87480d)
输出:
1 0 1 -1 false true
递增和递减运算符可以在操作数之前或者之后使用,比如i++和++i。两者的唯一区别是,如果递增或递减运算符放在其运算数前面(比如++i),Java就会在获得该运算数的值之前执行相应的操作,并将其用于表达式的其他部分;如果运算符放在其运算数后面(i++),Java就会先获得该操作数的值再进行递增或递减运算。具体的可以看下面的示例:
![](https://epubservercos.yuewen.com/7C97BD/18562448808360806/epubprivate/OEBPS/Images/Figure-P54_54576.jpg?sign=1739076553-s6WORtz5haoThuqyT6jpNLkBlERl3xzY-0-5937654343d39e819d9671b36b7c2b88)
输出:
4 5 6 6 7
2.2.4 等价和关系运算符
等价和关系运算符如表2-5所示。
表2-5 等价和关系运算符
![](https://epubservercos.yuewen.com/7C97BD/18562448808360806/epubprivate/OEBPS/Images/Figure-T54_54578.jpg?sign=1739076553-6GqDmdqgiG3H7EjWYCvNMUDvKIBn3hNn-0-f6aed912bdf43c369ed9bfa9e21b820b)
等价和关系运算符的例子如下:
![](https://epubservercos.yuewen.com/7C97BD/18562448808360806/epubprivate/OEBPS/Images/Figure-P55_54579.jpg?sign=1739076553-F31juKMrsm1GjgWFjIesx6aa6DLcMpyr-0-d40800305e0bd4190b3d0fef99e54050)
输出为:
value1 != value2 value1 < value2 value1 <= value2
2.2.5 条件运算符
条件运算符如表2-6所示。
表2-6 条件运算符
![](https://epubservercos.yuewen.com/7C97BD/18562448808360806/epubprivate/OEBPS/Images/Figure-T55_54582.jpg?sign=1739076553-pII6ljVFSWyrckszj5vCPrtjW9MOvOaL-0-b36f4d3cc5578f39c94afa782aa61648)
以下是条件与、条件或的运算符的例子:
![](https://epubservercos.yuewen.com/7C97BD/18562448808360806/epubprivate/OEBPS/Images/Figure-P56_54583.jpg?sign=1739076553-kRFvqYILlDhBHHpzPhGRFdUN6S3PZhld-0-c0f1b8ae4bc59af782d2438cdcce0c88)
输出:
value1 is 1 AND value2 is 2 value1 is 1 OR value2 is 1
下面是一个三元运算符的例子,类似于if-then-else语句:
![](https://epubservercos.yuewen.com/7C97BD/18562448808360806/epubprivate/OEBPS/Images/Figure-P56_54584.jpg?sign=1739076553-QD0gLToD2U4VVEUsxzot8KvGO79Qk9Cf-0-25a784cdbd71f955bb81ccdae01004ce)
输出:
1
2.2.6 instanceof运算符
instanceof用于匹配判断对象的类型,可以用来测试对象是否是类的一个实例、子类的实例或者是实现了一个特定接口的类的实例。
在下面的例子中,父类是Parent,接口是MyInterface,子类是Child继承了父类并实现了接口。
![](https://epubservercos.yuewen.com/7C97BD/18562448808360806/epubprivate/OEBPS/Images/Figure-P57_54586.jpg?sign=1739076553-33u9KgAbjfAMBbey2eBv7ayjaDqctpfX-0-bf9a894360cc8258b74c8dad3874f30c)
注意
Parent、Child及MyInterface是定义在InstanceofDemo类中的,这样的类和接口被称为内部类和内部接口。
输出为:
obj1 instanceof Parent: true obj1 instanceof Child: false obj1 instanceof MyInterface: false obj2 instanceof Parent: true obj2 instanceof Child: true obj2 instanceof MyInterface: true
注意
null不是任何类的实例。
2.2.7 位运算符和位移运算符
位运算符和位移运算符适用于整型。
1.位运算符
表2-7总结了所有的位运算符。
表2-7 位运算符
![](https://epubservercos.yuewen.com/7C97BD/18562448808360806/epubprivate/OEBPS/Images/Figure-T58_54592.jpg?sign=1739076553-yOFeSZwINInaD6ixN6E3lkeBumQYuxGF-0-04178f88e5141b11c6ea1b78e53807ce)
以下是位运算符使用的例子:
![](https://epubservercos.yuewen.com/7C97BD/18562448808360806/epubprivate/OEBPS/Images/Figure-P58_54593.jpg?sign=1739076553-OscGB2LbKk8nRMKtePtdYmHBe5qQJG2J-0-b92092e88fe531a7c28daa0e8ee903b0)
输出为:
2
2.位移运算符
首先阐述一下符号位的概念:
· 符号位是数的最后一位,不是用来计算的。
· 当符号位为0时,值为正数;当符号位为1时,值为负数。
· 无符号位时为正数,有符号位时为正数或者负数。
表2-8总结了所有的位移运算符。
表2-8 位移运算符
![](https://epubservercos.yuewen.com/7C97BD/18562448808360806/epubprivate/OEBPS/Images/Figure-T59_54596.jpg?sign=1739076553-pt1oKI6RGyqekkBrrnSE3U38iFxALv82-0-a6e902fcee9b99879609a5a43444a062)
其中:
· 左移运算和右移运算移动后都会保留符号位!
· 右移(补零)移动后不保留符号位,永远为正数,因为其符号位总是被补零。
以下是位移运算符的例子:
![](https://epubservercos.yuewen.com/7C97BD/18562448808360806/epubprivate/OEBPS/Images/Figure-P59_54599.jpg?sign=1739076553-uDviZUaMVJ3xuTSbJzP9elfBYhsqNVpq-0-89f0626f7ed1a1db8586e9785cd807d4)
输出为:
-101<<1=-202 -101<<2=-404 -101<<3=-808 -101<<4=-1616 -101<<5=-3232 -101<<6=-6464 -101<<7=-12928 -101<<8=-25856 -101<<9=-51712 -101<<10=-103424 -101<<11=-206848 -101<<12=-413696 -101<<13=-827392 -101<<14=-1654784 -101<<15=-3309568 -101<<16=-6619136 -101<<17=-13238272 -101<<18=-26476544 -101<<19=-52953088 -101<<20=-105906176 -101<<21=-211812352 -101<<22=-423624704 -101<<23=-847249408 -101<<24=-1694498816 -101<<25=905969664 -101<<26=1811939328 -101<<27=-671088640 -101<<28=-1342177280 -101<<29=1610612736 -101<<30=-1073741824 -101<<31=-2147483648 -101<<32=-101