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