在Java中,一些數據型別之間是可以相互轉換的。分爲兩種情況:自動型別
把一個表示數據範圍大的數值或者變數賦值給另一個表示數據範圍小的變數。
強制型別轉換格式:目標數據型別 變數名 = (目標數據型別)值或者變數;
例如:
double num1 = 5.5;
int num2 = (int) num1; // 將double型別的num1強制轉換爲int型別
System.out.println(num2); // 輸出5(小數位直接捨棄)
符號 | 作用 | 說明 |
---|---|---|
+ | 加 | 參看小學一年級 |
- | 減 | 參看小學一年級 |
* | 乘 | 參看小學二年級,與「×」相同 |
/ | 除 | 參看小學二年級,與「÷」相同 |
% | 取餘 | 獲取的是兩個數據做除法的餘數 |
注意:
int a = 10;
int b = 3;
System.out.println(a / b); // 輸出結果3
System.out.println(a % b); // 輸出結果1
char型別參與算術運算,使用的是計算機底層對應的十進制數值。需要我們記住三個字元對應的數值:
‘a’ – 97 a-z是連續的,所以’b’對應的數值是98,'c’是99,依次遞加
‘A’ – 65 A-Z是連續的,所以’B’對應的數值是66,'C’是67,依次遞加
‘0’ – 48 0-9是連續的,所以’1’對應的數值是49,'2’是50,依次遞加
// 可以通過使用字元與整數做算術運算,得出字元對應的數值是多少
char ch1 = 'a';
System.out.println(ch1 + 1); // 輸出98,97 + 1 = 98
char ch2 = 'A';
System.out.println(ch2 + 1); // 輸出66,65 + 1 = 66
char ch3 = '0';
System.out.println(ch3 + 1); // 輸出49,48 + 1 = 49
算術表達式中包含不同的基本數據型別的值的時候,整個算術表達式的型別會自動進行提升。
提升規則:
byte型別,short型別和char型別將被提升到int型別,不管是否有其他型別參與運算。
整個表達式的型別自動提升到與表達式中最高等級的運算元相同的型別
等級順序:byte,short,char --> int --> long --> float --> double
例如:
byte b1 = 10;
byte b2 = 20;
// byte b3 = b1 + b2; // 該行報錯,因爲byte型別參與算術運算會自動提示爲int,int賦值給byte可能損失精度
int i3 = b1 + b2; // 應該使用int接收
byte b3 = (byte) (b1 + b2); // 或者將結果強制轉換爲byte型別
-------------------------------
int num1 = 10;
double num2 = 20.0;
double num3 = num1 + num2; // 使用double接收,因爲num1會自動提升爲double型別
當「+」操作中出現字串時,這個」+」是字串連線符,而不是算術運算。
System.out.println("itheima"+ 666); // 輸出:itheima666
在」+」操作中,如果出現了字串,就是連線運算子,否則就是算術運算。當連續進行「+」操作時,從左到右逐個執行。
System.out.println(1 + 99 + "年黑馬"); // 輸出:100年黑馬
System.out.println(1 + 2 + "itheima" + 3 + 4); // 輸出:3itheima34
// 可以使用小括號改變運算的優先順序
System.out.println(1 + 2 + "itheima" + (3 + 4)); // 輸出:3itheima7
需求:
鍵盤錄入一個三位數,將其拆分爲個位,十位,百位,列印在控制檯
範例程式碼:
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
// 1:使用Scanner鍵盤錄入一個三位數
Scanner sc = new Scanner(System.in);
System.out.println("請輸入一個三位數");
int num = sc.nextInt();
// 2:個位的計算:數值 % 10
int ge = num % 10;
// 3:十位的計算:數值 / 10 % 10
int shi = num / 10 % 10;
// 4:百位的計算:數值 / 100
int bai = num / 100;
// 5:將個位, 十位, 百位拼接上正確的字串, 列印即可
System.out.println("整數"+num+"個位爲:" + ge);
System.out.println("整數"+num+"十位爲:" + shi);
System.out.println("整數"+num+"百位爲:" + bai);
}
}
符號 | 作用 | 說明 |
---|---|---|
++ | 自增 | 變數的值加1 |
– | 自減 | 變數的值減1 |
注意事項:
++和-- 既可以放在變數的後邊,也可以放在變數的前邊。
單獨使用的時候, ++和-- 無論是放在變數的前邊還是後邊,結果是一樣的。
參與操作的時候,如果放在變數的後邊,先拿變數參與操作,後拿變數做++或者–。
參與操作的時候,如果放在變數的前邊,先拿變數做++或者–,後拿變數參與操作。
最常見的用法:單獨使用。
int i = 10;
i++; // 單獨使用
System.out.println("i:" + i); // i:11
int j = 10;
++j; // 單獨使用
System.out.println("j:" + j); // j:11
int x = 10;
int y = x++; // 賦值運算,++在後邊,所以是使用x原來的值賦值給y,x本身自增1
System.out.println("x:" + x + ", y:" + y); // x:11,y:10
int m = 10;
int n = ++m; // 賦值運算,++在前邊,所以是使用m自增後的值賦值給n,m本身自增1
System.out.println("m:" + m + ", m:" + m); // m:11,m:11
練習:
int x = 10;
int y = x++ + x++ + x++;
System.out.println(y); // y的值是多少?
/*
解析,三個表達式都是++在後,所以每次使用的都是自增前的值,但程式自左至右執行,所以第一次自增時,使用的是10進行計算,但第二次自增時,x的值已經自增到11了,所以第二次使用的是11,然後再次自增。。。
所以整個式子應該是:int y = 10 + 11 + 12;
輸出結果爲33。
*/
注意:通過此練習深刻理解自增和自減的規律,但實際開發中強烈建議不要寫這樣的程式碼!小心捱打!
賦值運算子的作用是將一個表達式的值賦給左邊,左邊必須是可修改的,不能是常數。
符號 | 作用 | 說明 |
---|---|---|
= | 賦值 | a=10,將10賦值給變數a |
+= | 加後賦值 | a+=b,將a+b的值給a |
-= | 減後賦值 | a-=b,將a-b的值給a |
*= | 乘後賦值 | a*=b,將a×b的值給a |
/= | 除後賦值 | a/=b,將a÷b的商給a |
%= | 取餘後賦值 | a%=b,將a÷b的餘數給a |
注意:
擴充套件的賦值運算子隱含了強制型別轉換。
short s = 10;
s = s + 10; // 此行程式碼報出,因爲運算中s提升爲int型別,運算結果int賦值給short可能損失精度
s += 10; // 此行程式碼沒有問題,隱含了強制型別轉換,相當於 s = (short) (s + 10);
關係運算符有6種關係,分別爲小於、小於等於、大於、等於、大於等於、不等於。
符號 | 說明 |
---|---|
== | a==b,判斷a和b的值是否相等,成立爲true,不成立爲false |
!= | a!=b,判斷a和b的值是否不相等,成立爲true,不成立爲false |
> | a>b,判斷a是否大於b,成立爲true,不成立爲false |
>= | a>=b,判斷a是否大於等於b,成立爲true,不成立爲false |
< | a<b,判斷a是否小於b,成立爲true,不成立爲false |
<= | a<=b,判斷a是否小於等於b,成立爲true,不成立爲false |
注意事項:
關係運算符的結果都是boolean型別,要麼是true,要麼是false。
千萬不要把「」誤寫成「=」,"「是判斷是否相等的關係,」="是賦值。
int a = 10;
int b = 20;
System.out.println(a == b); // false
System.out.println(a != b); // true
System.out.println(a > b); // false
System.out.println(a >= b); // false
System.out.println(a < b); // true
System.out.println(a <= b); // true
// 關係運算的結果肯定是boolean型別,所以也可以將運算結果賦值給boolean型別的變數
boolean flag = a > b;
System.out.println(flag); // 輸出false
邏輯運算子把各個運算的關係表達式連線起來組成一個複雜的邏輯表達式,以判斷程式中的表達式是否成立,判斷的結果是 true 或 false。
符號 | 作用 | 說明 |
---|---|---|
& | 邏輯與 | a&b,a和b都是true,結果爲true,否則爲false |
| | 邏輯或 | a|b,a和b都是false,結果爲false,否則爲true |
^ | 邏輯互斥或 | a^b,a和b結果不同爲true,相同爲false |
! | 邏輯非 | !a,結果和a的結果正好相反 |
//定義變數
int i = 10;
int j = 20;
int k = 30;
//& 「與」,並且的關係,只要表達式中有一個值爲false,結果即爲false
System.out.println((i > j) & (i > k)); //false & false,輸出false
System.out.println((i < j) & (i > k)); //true & false,輸出false
System.out.println((i > j) & (i < k)); //false & true,輸出false
System.out.println((i < j) & (i < k)); //true & true,輸出true
System.out.println("--------");
//| 「或」,或者的關係,只要表達式中有一個值爲true,結果即爲true
System.out.println((i > j) | (i > k)); //false | false,輸出false
System.out.println((i < j) | (i > k)); //true | false,輸出true
System.out.println((i > j) | (i < k)); //false | true,輸出true
System.out.println((i < j) | (i < k)); //true | true,輸出true
System.out.println("--------");
//^ 「互斥或」,相同爲false,不同爲true
System.out.println((i > j) ^ (i > k)); //false ^ false,輸出false
System.out.println((i < j) ^ (i > k)); //true ^ false,輸出true
System.out.println((i > j) ^ (i < k)); //false ^ true,輸出true
System.out.println((i < j) ^ (i < k)); //true ^ true,輸出false
System.out.println("--------");
//! 「非」,取反
System.out.println((i > j)); //false
System.out.println(!(i > j)); //!false,,輸出true
符號 | 作用 | 說明 |
---|---|---|
&& | 短路與 | 作用和&相同,但是有短路效果 |
|| | 短路或 | 作用和|相同,但是有短路效果 |
在邏輯與運算中,只要有一個表達式的值爲false,那麼結果就可以判定爲false了,沒有必要將所有表達式的值都計算出來,短路與操作就有這樣的效果,可以提高效率。同理在邏輯或運算中,一旦發現值爲true,右邊的表達式將不再參與運算。
int x = 3;
int y = 4;
System.out.println((x++ > 4) & (y++ > 5)); // 兩個表達都會運算
System.out.println(x); // 4
System.out.println(y); // 5
System.out.println((x++ > 4) && (y++ > 5)); // 左邊已經可以確定結果爲false,右邊不參與運算
System.out.println(x); // 4
System.out.println(y); // 4
三元運算子語法格式:
關係表達式 ? 表達式1 : 表達式2;
解釋:問號前面的位置是判斷的條件,判斷結果爲boolean型,爲true時呼叫表達式1,爲false時呼叫表達式2。其邏輯爲:如果條件表達式成立或者滿足則執行表達式1,否則執行第二個。
舉例:
int a = 10;
int b = 20;
int c = a > b ? a : b; // 判斷 a>b 是否爲真,如果爲真取a的值,如果爲假,取b的值
需求:
一座寺廟裏住着三個和尚,已知他們的身高分別爲150cm、210cm、165cm,請用程式實現獲取這三個和尚的最高身高。
public class OperatorTest02 {
public static void main(String[] args) {
//1:定義三個變數用於儲存和尚的身高,單位爲cm,這裏僅僅體現數值即可。
int height1 = 150;
int height2 = 210;
int height3 = 165;
//2:用三元運算子獲取前兩個和尚的較高身高值,並用臨時身高變數儲存起來。
int tempHeight = height1 > height2 ? height1 : height2;
//3:用三元運算子獲取臨時身高值和第三個和尚身高較高值,並用最大身高變數儲存。
int maxHeight = tempHeight > height3 ? tempHeight : height3;
//4:輸出結果
System.out.println("maxHeight:" + maxHeight);
}
}
在一個程式執行的過程中,各條語句的執行順序對程式的結果是有直接影響的。所以,我們必須清楚每條語句的執行流程。而且,很多時候要通過控制語句的執行順序來實現我們想要的功能。
需求:小明快要期末考試了,小明爸爸對他說,會根據他不同的考試成績,送他不同的禮物,假如你可以控制小明的得分,請用程式實現小明到底該獲得什麼樣的禮物,並在控制檯輸出。
分析:
①小明的考試成績未知,可以使用鍵盤錄入的方式獲取值
②由於獎勵種類較多,屬於多種判斷,採用if…else…if格式實現
③爲每種判斷設定對應的條件
④爲每種判斷設定對應的獎勵
import java.util.Scanner;
public class IfTest02 {
public static void main(String[] args){
// 1. 使用Scanner錄入考試成績
Scanner sc = new Scanner(System.in);
System.out.println("請輸入您的成績:");
int score = sc.nextInt();
// 2. 判斷成績是否在合法範圍內 0~100
if(score >=0 && score <= 100){
// 合法成績
// 3. 在合法的語句塊中判斷成績範圍符合哪一個獎勵
if(score >= 95 && score <= 100){
System.out.println("自行車一輛");
}else if(score >= 90 && score <= 94){
System.out.println("遊樂場一次");
}else if(score >= 80 && score <= 89){
System.out.println("變形金剛一個");
}else {
System.out.println("挨頓揍, 這座城市又多了一個傷心的人~");
}
}else{
// 非法的話, 給出錯誤提示
System.out.println("您的成績輸入有誤!");
}
}
}