一. 算數(shù)運(yùn)算符
概念
算術(shù)運(yùn)算符與我們?cè)跀?shù)學(xué)中學(xué)習(xí)的計(jì)算符號(hào)一樣,主要用在數(shù)學(xué)表達(dá)式中,常見的算術(shù)運(yùn)算符有:
/ % ++ --
這幾個(gè)符號(hào)的功能如下表所示:
操作符 描述 案例(A=5,B=10)
+ 加法 - 相加運(yùn)算符兩側(cè)的值;字符串拼接 A + B = 15
- 減法 - 左操作數(shù)減去右操作數(shù) A – B = -5
* 乘法 - 相乘操作符兩側(cè)的值 A * B = 50
/ 除法 - 左操作數(shù)除以右操作數(shù) B / A = 2
% 取余 - 左操作數(shù)除以右操作數(shù)的余數(shù) B % A = 0
++ 自增: 操作數(shù)的值增加1 B++ 或 ++B = 11(區(qū)別見下文)
-- 自減: 操作數(shù)的值減少1 B-- 或 --B = 9(區(qū)別
見下文)
2. 案例
2.1 基本運(yùn)算
public class TypeDemo04 {
}
我們要特別注意,整數(shù)由于存在范圍的限制,如果計(jì)算結(jié)果超出了范圍,就會(huì)產(chǎn)生溢出。而溢出不會(huì)出錯(cuò),但會(huì)得到一個(gè)奇怪的結(jié)果。
2.2 除零算術(shù)異常
另外壹哥還要提醒大家一下,在Java中的除法和取模運(yùn)算,和數(shù)學(xué)中的要求一樣,是不能做除零操作的,否則在運(yùn)行時(shí)會(huì)產(chǎn)生異常哦!這里會(huì)產(chǎn)生java.lang.ArithmeticException: / by zero的異常。
2.3 類型提升(重點(diǎn))
我們?cè)谶M(jìn)行數(shù)值計(jì)算時(shí),要注意類型提升的問題。當(dāng)算術(shù)表達(dá)式中包含不同的基本類型值時(shí),整個(gè)算術(shù)表達(dá)式的類型會(huì)進(jìn)行自動(dòng)提升。基本的提升規(guī)則為:
為了計(jì)算方便,Java會(huì)將小于4個(gè)字節(jié)的類型,在計(jì)算時(shí)將其隱形提升到int類型。所以byte類型、short類型和char類型會(huì)被提升為int類型,不管是否有其他類型參與運(yùn)算。也就是說(shuō),整個(gè)表達(dá)式的類型會(huì)自動(dòng)提升到與表達(dá)式中最高等級(jí)的操作數(shù)相同的類型。所以兩個(gè)數(shù)值進(jìn)行計(jì)算,結(jié)果取決于范圍更大的那個(gè)數(shù)!比如兩個(gè)int計(jì)算,結(jié)果是int。而int與浮點(diǎn)數(shù)進(jìn)行計(jì)算,則結(jié)果為浮點(diǎn)數(shù),即結(jié)果變成更大范圍的類型,這就是類型提升!
提升等級(jí)順序?yàn)椋?/p>
byte、short、char --> int --> long --> float --> double
所以由于類型提升的原因,我們?cè)陂_發(fā)時(shí)很少使用byte或者short來(lái)定義整數(shù)。也很少會(huì)使用char類型定
義字符,而是使用字符串類型,更不會(huì)使用char類型做算術(shù)運(yùn)算。
2.4 +號(hào)的兩個(gè)作用
Java中的+號(hào)有2個(gè)功能,一是可以進(jìn)行加法操作,二是可以進(jìn)行字符串拼接。尤其是在進(jìn)行字符串拼接時(shí),要考慮自左向右的結(jié)合性。當(dāng)字符串在前,數(shù)字在后,執(zhí)行字符串拼接操作;當(dāng)數(shù)字在前,字符串字后,先計(jì)算出結(jié)果,再進(jìn)行字符串的拼接。
public class TypeDemo04 {
}
2.5 %的作用
%是取余符號(hào),我們可以進(jìn)行取余運(yùn)算,也叫做取模運(yùn)算。另外%在Java中不但可以對(duì)整數(shù)進(jìn)行取模,還可以對(duì)double進(jìn)行取模操作。
public class TypeDemo04 {
}
2.6 自增與自減
對(duì)初學(xué)者來(lái)說(shuō),有兩個(gè)符號(hào)可能會(huì)讓你比較懵圈,一個(gè)是++,一個(gè)是--,這兩個(gè)符號(hào)分別叫做自增和自減運(yùn)算符。++是自增符號(hào),根據(jù)++在變量前或變量后的位置不同,也具有不同的特點(diǎn),--自減符號(hào)同樣如此。++和--具有如下特點(diǎn):
●++和-- 既可以放在變量的后邊,也可以放在變量的前邊;
●單獨(dú)使用時(shí), ++和-- 無(wú)論是放在變量的前邊還是后邊,結(jié)果都是一樣的;
●參與操作時(shí),如果放在變量的后邊,會(huì)先使用變量參與操作,再取變量的值進(jìn)行++或者--;
●參與操作時(shí),如果放在變量的前邊,會(huì)先取變量的值進(jìn)行++或者--,后使用變量參與操作;
●只有變量才能使用自增/自減運(yùn)算符,常量不能使用自增與自減符號(hào),因?yàn)槌A坎辉试S被修改。
public class TypeDemo04 {
}
【++變量】變量先+1,然后使用變量+1之后的值;【變量++】先使用變量原來(lái)的值,表達(dá)式結(jié)束時(shí)給變量+1。所在在本案例中,如果++在變量之后,比如d++,具有“先使用,再自增”的特點(diǎn)。如果++在變量之前,比如++d,具有“先自增,再使用”的特點(diǎn)。--自減符號(hào)也是如此。壹哥不建議初學(xué)者把++運(yùn)算混入到常規(guī)運(yùn)算中,容易把你給搞懵逼哦。
二. 賦值運(yùn)算符
概念在Java中,“=”是賦值運(yùn)算符,而不是我們通常認(rèn)知中的“等號(hào)”。賦值運(yùn)算符用于將“=”右側(cè)表達(dá)式的結(jié)果,賦值給“=”左側(cè)的變量。另外,除了“=”這個(gè)賦值符號(hào)之外,還有另外幾個(gè)擴(kuò)展的賦值符號(hào),所以目前常用的賦值符號(hào)有如下幾個(gè):= += -= *= /= %=
案例2.1 賦值案例以下是幾個(gè)賦值運(yùn)算符的基本使用案例。在下面的案例中,大家要注意除法的計(jì)算結(jié)果哦。public class TypeDemo04 {public static void main(String[] args) {//=賦值運(yùn)算符int a = 10;a += 2; //12,相當(dāng)于 a=a+2;System.out.println("a="+a);a -= 3; //9,a = a - 3;System.out.println("a="+a);a *= 4; //36,a = a * 4;System.out.println("a="+a);//注意:Java中的除法,36/5=7哦,不會(huì)等于7.2,想想這是為什么?a /= 5; //7,a = a / 5;System.out.println("a="+a);a %= 6; //1,a = a % 6;System.out.println("a="+a);}}2.2 擴(kuò)展案例為了讓大家更好地理解賦值運(yùn)算符,壹哥再給大家擴(kuò)展一個(gè)案例。public class TypeDemo04 {
}
在這個(gè)案例中,我們一定要注意類型提升的問題。兩個(gè)short變量s1和s2,s1+s2時(shí)會(huì)進(jìn)行類型提升變成int,所以必須對(duì)結(jié)果進(jìn)行強(qiáng)制類型轉(zhuǎn)換才行,如下圖所示:
但是當(dāng)我們使用s2+=s1語(yǔ)句時(shí),雖然計(jì)算結(jié)果與s2=s1+s2是相同的,但內(nèi)部的執(zhí)行原理卻不同,這是因?yàn)閿U(kuò)展的賦值運(yùn)算符都隱含了強(qiáng)制類型轉(zhuǎn)換。s2 = s1 + s2;此行代碼會(huì)報(bào)錯(cuò),這是因?yàn)檫\(yùn)算中s變量會(huì)提升為int類型,運(yùn)算結(jié)果int賦值給short可能會(huì)損失精度。
而在s2+=s1語(yǔ)句中就沒有問題,因?yàn)檫@里隱含了強(qiáng)制類型轉(zhuǎn)換,相當(dāng)于s2 = (short) (s2 + s1);不用進(jìn)行再額外強(qiáng)制類型轉(zhuǎn)換,這一點(diǎn)我們一定要注意!
三. 關(guān)系運(yùn)算符
概念
在Java中,關(guān)系運(yùn)算符,又叫做比較運(yùn)算符, 或者叫做布爾運(yùn)算符,主要是用于比較兩個(gè)表達(dá)式的結(jié)果。常用的賦值符號(hào)有如下幾個(gè):
案例
接下來(lái)我們?cè)偻ㄟ^一些代碼案例,來(lái)學(xué)習(xí)一下關(guān)系運(yùn)算符的用法吧。我們?cè)谑褂帽容^運(yùn)算時(shí),最終都會(huì)得到一個(gè)布爾類型的值。且在進(jìn)行比較運(yùn)算時(shí),一定要注意其優(yōu)先級(jí)。
public class TypeDemo04 {
public static void main(String[] args) {
// 關(guān)系運(yùn)算符
int a = 10;
int b = 20;
System.out.println(a > b);
System.out.println(a >= b);
System.out.println(a < b);
System.out.println(a <= b);
System.out.println(a == b);
System.out.println(a != b);
// 判斷奇數(shù)與偶數(shù)
// 偶數(shù)條件: a % 2 == 0
// 奇數(shù)條件: a % 2 != 0
System.out.println("a != b " + (a != b));
System.out.println("a % 2 != 0 " + (a % 2 != 0));
}
}
四. 邏輯運(yùn)算符
概念
Java中的邏輯運(yùn)算符, 主要有3個(gè):邏輯與&&、邏輯或||、邏輯非!,如下所示:
&& || !
Java中的邏輯運(yùn)算符,其實(shí)和數(shù)學(xué)中的與、或、非意思一致。 邏輯運(yùn)算符大多數(shù)會(huì)和其他的運(yùn)算符一起使用,主要做一些簡(jiǎn)單或復(fù)雜的邏輯運(yùn)算。且通常都會(huì)和 if、for等邏輯表達(dá)式一起使用,使用格式為:表達(dá)式1 邏輯運(yùn)算符 表達(dá)式2
案例
接下來(lái)我們通過一個(gè)案例來(lái)演示邏輯運(yùn)算符該如何使用。
public class TypeDemo04 {
}
對(duì)于上述代碼中的邏輯運(yùn)算符,壹哥再給大家細(xì)說(shuō)一下,我們要特別注意“短路與”和“短路或”的概念:
●&&:邏輯與(短路與)。所有的結(jié)果為true,最終的結(jié)果才是true。&&屬于短路與:邏輯與遵守短路求值的規(guī)則,即表達(dá)式1為假,表達(dá)式2就不再執(zhí)行。即如果左邊的表達(dá)式為真,右邊的表達(dá)式就會(huì)執(zhí)行;如果左邊為假,右邊不執(zhí)行。
●||:邏輯或(短路或)。所有的結(jié)果只要有一個(gè)為true,最終結(jié)果就是true。||屬于短路或:遵守或也遵守短路求值的規(guī)則,即表達(dá)式1為真,表達(dá)式2就不在執(zhí)行,否則就執(zhí)行表達(dá)式2。
●!: 邏輯非。對(duì)結(jié)果進(jìn)行取反。
●&:按位與。無(wú)論條件表達(dá)式的結(jié)果如何,都會(huì)執(zhí)行完整個(gè)表達(dá)式,所在無(wú)論左邊的表達(dá)式是真假,右邊的表達(dá)式都要執(zhí)行。
●|:按位或。無(wú)論條件表達(dá)式的結(jié)果如何,都會(huì)執(zhí)行完整個(gè)表達(dá)式。無(wú)論左邊的表達(dá)式是真假,右邊的表達(dá)式都要執(zhí)行。
五. 位運(yùn)算符
概念
我們知道,對(duì)任何編程語(yǔ)言而言,最終的操作都是用二進(jìn)制表示,因?yàn)橛?jì)算機(jī)的底層只認(rèn)識(shí)二進(jìn)制。而八進(jìn)制、十進(jìn)制或者十六進(jìn)制,都是為了讓開發(fā)人員方便開發(fā)而創(chuàng)立的。在Java中,也可以根據(jù)數(shù)的進(jìn)制進(jìn)行運(yùn)算,這就需要位運(yùn)算符的參與了。常用的位運(yùn)算符有如下幾個(gè):
& | ^ ~ << >> >>>
注意:& 和 | 既是位運(yùn)算符,也可以進(jìn)行邏輯運(yùn)算。
2. 案例
接下來(lái)我們通過一個(gè)案例來(lái)演示位運(yùn)算符該如何使用。
public class TypeDemo04 {
}
針對(duì)上述代碼,給大家解釋一下:
2.1 按位與
按位與&的特點(diǎn):相同數(shù)位都是1,最終的結(jié)果才是1。基本規(guī)則如下:
0 & 0 = 0;
0 & 1 = 0;
1 & 0 = 0;
1 & 1 = 1;
2.2 按位或
按位或|的特點(diǎn):只要相同數(shù)位上有1,結(jié)果就是1。
2.3 按位異或
按位亦或的特點(diǎn):相同數(shù)位相同為0,不同為1。
2.4 按位取反
按位取反的特點(diǎn):將每一位上的數(shù)字取反。結(jié)論:數(shù)字+1取反。
2.5 左移
左移<<的特點(diǎn):將二進(jìn)制數(shù)位整體向左移動(dòng)N位,低位補(bǔ)0。
2.6 右移
右移>>的特點(diǎn):將二進(jìn)制數(shù)位整體向右移動(dòng)N位。如果是正數(shù)補(bǔ)0,負(fù)數(shù)補(bǔ)1。
2.7 無(wú)符號(hào)右移
無(wú)符號(hào)右移>>>的特點(diǎn):將二進(jìn)制數(shù)位整體向右移動(dòng)N位。高位補(bǔ)0
六. 條件運(yùn)算符
概念
條件運(yùn)算符,又叫做三目運(yùn)算符,目前在 Java 中只有一個(gè)三目運(yùn)算符 ? :三目運(yùn)算的語(yǔ)法格式如下:
布爾表達(dá)式 ? 表達(dá)式1 : 表達(dá)式2
很多時(shí)候,三目運(yùn)算都是 if 和 else 的簡(jiǎn)寫。
案例
public class TypeDemo04 {
public static void main(String[] args) {
//條件表達(dá)式,三目運(yùn)算符
//判斷年齡,如果大于18歲,輸出成年人,否則輸出未成年人
int age = 70;
String s = age > 18 ? "成年人" : "未成年人";
System.out.println(s);
//a和b比較,輸出較大的數(shù)字
int a = 10;
int b = 20;
int num = a > b ? a : b;
System.out.println(num);
//三目運(yùn)算符嵌套使用
//判斷年齡。如果大于18歲,輸出成年人;但如果大于60歲,輸出老年人,否則輸出未成年人
String s1 = age > 18 ? age > 60 ? "老年人" : "成年人" : "未成年人";
System.out.println(s1);
}
}
三目運(yùn)算符雖然可以嵌套使用,但我們?cè)陂_發(fā)時(shí)盡量不要這么使用,這樣的代碼可讀性很差。