![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=1738820362-Hh7U5Z2HmSiBKylwa1tceYE3f9wAV7v6-0-7902cac1cc3a917a995fb8bbc8ca1e99)
在表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=1738820362-mEEvs71N7cTS4xQ9ljHpevAo3F9oFsxa-0-fb74242f41cd562b74218fdeceeff2df)
以下是算术运算符的一些示例:
![](https://epubservercos.yuewen.com/7C97BD/18562448808360806/epubprivate/OEBPS/Images/Figure-P51_54564.jpg?sign=1738820362-VLpr6A2iDw9eVhau9AUa0lqIHSVpyEkf-0-2ffadec91ca93dbc393aa44989fb1a14)
输出为:
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=1738820362-lbedZ24DySyPOejUbcsiepZYl1CE32nj-0-26c6d3539845f8f6e84afe5b9214b263)
输出为:
Hello World!
2.2.3 一元运算符
一元运算符只需要一个操作数,如表2-4所示。
表2-4 一元运算符
![](https://epubservercos.yuewen.com/7C97BD/18562448808360806/epubprivate/OEBPS/Images/Figure-T53_54569.jpg?sign=1738820362-jboB5nKmLcgBBu0EB992HaJijcwnOlbh-0-e30f8f7d8fe45520462e31b439764508)
下面是一元运算符的一些示例:
![](https://epubservercos.yuewen.com/7C97BD/18562448808360806/epubprivate/OEBPS/Images/Figure-P53_54570.jpg?sign=1738820362-iMq8dKatyoZIJWHudP0IUNiGMoPyM7S6-0-cba3a779db7245e4dbc47a2c358be7a5)
输出:
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=1738820362-6eFJdc9ql8Pe95o3o4WRVTccJST7JriL-0-6ea4ac2813032e3532cb05d31b12aad4)
输出:
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=1738820362-sQlTLkAMhWMqAubVrRg13gzK4F4JSp36-0-13e8133fba095796bafb9bd17ba85ba9)
等价和关系运算符的例子如下:
![](https://epubservercos.yuewen.com/7C97BD/18562448808360806/epubprivate/OEBPS/Images/Figure-P55_54579.jpg?sign=1738820362-uuZDNgAFSyVp4h6TKzFCQwFocNGfEHb6-0-4cc67649809439c685884f0dc757b1da)
输出为:
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=1738820362-H5v9etHMiCXvBtpx8AFkrgE2PetvmPQw-0-0abd3d3e20262d1da5972bcc72603ccf)
以下是条件与、条件或的运算符的例子:
![](https://epubservercos.yuewen.com/7C97BD/18562448808360806/epubprivate/OEBPS/Images/Figure-P56_54583.jpg?sign=1738820362-WjiV7Mc282PF6qubkeKdcbsd3onFrEta-0-656156603c646577d7f5f16150cdd8ed)
输出:
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=1738820362-4lujmoWV5sUa2wwyyAw7aQmIPWgP6EQY-0-7e2ffe26f13f19793c66864246aed32a)
输出:
1
2.2.6 instanceof运算符
instanceof用于匹配判断对象的类型,可以用来测试对象是否是类的一个实例、子类的实例或者是实现了一个特定接口的类的实例。
在下面的例子中,父类是Parent,接口是MyInterface,子类是Child继承了父类并实现了接口。
![](https://epubservercos.yuewen.com/7C97BD/18562448808360806/epubprivate/OEBPS/Images/Figure-P57_54586.jpg?sign=1738820362-5nybKRzG6qcOoXIzcL0HYr1aDdWDzxwy-0-87f6d92c6ddfde0ff94462ae2811f87f)
注意
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=1738820362-WoEu1ha2bfskptUN0CcOJBbEeQf7COgM-0-3d7f0b8a9fc9d73ef618616fb4f77c2e)
以下是位运算符使用的例子:
![](https://epubservercos.yuewen.com/7C97BD/18562448808360806/epubprivate/OEBPS/Images/Figure-P58_54593.jpg?sign=1738820362-b07guphxuYDD9XvEyfbGLaHx78RbleK7-0-cb25de6da3e717f7abb4bf9a8286b722)
输出为:
2
2.位移运算符
首先阐述一下符号位的概念:
· 符号位是数的最后一位,不是用来计算的。
· 当符号位为0时,值为正数;当符号位为1时,值为负数。
· 无符号位时为正数,有符号位时为正数或者负数。
表2-8总结了所有的位移运算符。
表2-8 位移运算符
![](https://epubservercos.yuewen.com/7C97BD/18562448808360806/epubprivate/OEBPS/Images/Figure-T59_54596.jpg?sign=1738820362-dPfIvhMtgJecqp0ZnbpWLLpZyo16av6Z-0-0b92490e375f6e01910890c79e9cebb2)
其中:
· 左移运算和右移运算移动后都会保留符号位!
· 右移(补零)移动后不保留符号位,永远为正数,因为其符号位总是被补零。
以下是位移运算符的例子:
![](https://epubservercos.yuewen.com/7C97BD/18562448808360806/epubprivate/OEBPS/Images/Figure-P59_54599.jpg?sign=1738820362-anYXUkSi9f6SaVRWoG9KH1KuUCot7eY6-0-80e9a2c8bef4200b34b09a6445de7ef8)
输出为:
-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