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