Day02-Java基礎語法
1.運算符
1.1算術運算符(理解)
1.1.1 運算符和表達式
運算符:對常量或者變進行操作的符號 表達式:用運算符把常量或者變量連接起來符合java語法的式子就可以稱爲表達式 不同運算符連接的表達式體現的是不同類型的表達式 舉例說明 int a = 10; int b = 20; int c = a + b;
1.1.2算術運算符
注意: /和%的區別:兩個數據做除法,/取商的結果,%取餘的結果 整數操作只能得到整數,要想得到小數,必須要有浮點數參與運算 int a = 10; int b = 3; System.out.println(a / b); //3 System.out.println(a % b); //1
1.1.3字符的"+"操作
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類型 tips:正是由於上述原因,所以在程序開發中我們很少使用byte或者short類型定義整數.也很少使用char類型定義字符,而使用字符串類型,更不會使用char類型做算術運算.
1.1.4字符串的"+"操作
當+操作中出現字符串時,這個+是字符串連接符,而不是算術運算. 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
1.2賦值運算符(應用)
賦值運算符的作用是將一個表達式的值賦給左邊,左邊必須是可修改的,不能是常量. = += -= *= /= %= 注意: 擴展的賦值運算符隱含了強制類型轉換. short s = 10; s = s + 10; //此行代碼報錯,因爲運算中s提升爲int類型,運算結果int賦值給short可能損失精度 s += 10; //此行代碼沒有報錯,隱含了強制轉換,相當於s = (short) (s + 10);
1.3自增自減運算符(理解)
++ -- 注意事項: ++和--既可以放在變量的後邊,也可以放在變量的前面. 單獨使用的時候,++和--無論是放在變量的前邊還是後邊,結果都是一樣的. 參與操作的時候,如果放在變量的後邊,先拿變量參與操作,後拿變量做++或者--. 參與操作的時候,如果放在變量的前面,先拿變量做++或者--,後拿變量參與操作. 最常見的使用:單獨使用. 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 + ", n:" + n); //m:11 n:11 看程序寫結果 int x = 4; 4 6 60 int y = (x++)+(++x)+x*10; System.out.println("x="+x); // x=6 System.out.println("y="+y); // y =70
1.4關係運算符(應用)
關係運算符有六種關係: == != > >= < <= 注意事項: 關係運算符的結果都是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
1.5邏輯運算符(應用)
邏輯運算符把各個運算關係表達式連接起來組成一個複雜的邏輯表達式,以判斷程序過程中的表達式是否成立,判斷的結果是true或false. &邏輯與 |邏輯或 ^邏輯異或 !邏輯非 &:符號兩邊的布爾值同時爲true的時候,結果纔是true 遇false則false 應用場景:用於範圍性的判斷查找 |:符號左右兩邊有一個爲true,結果就是true 遇true則true 應用場景:用於多條件的判斷查找 !:true變false, false變true ^:相同爲false, 不同爲true 擴展:異或的特點 一個數被另一個數異或兩次,該數本身不變. 實現兩個變量的數據交換,不能使用第三方變量. int a = 10; int b = 20; a = a ^ b; b = a ^ b; // b = (a^b) ^b = a a = a ^ b; // a = (a^b) ^ a = b
短路邏輯運算符
&&短路與 ||短路或 &和&&的區別: 總結: &: 無論符號左邊是true還是false,右邊都要繼續執行 &&:短路與,當符號左邊爲false的時候,右邊就不執行了. 但是,如果左邊爲true,右邊還是要繼續執行的. 結論:短路與可以提升一點點執行效率. |與||的區別: 總結: |:無論符號左邊是true還是false,右邊都要繼續執行. ||:具有短路效果,當符號左邊爲true的時候,右邊就不執行了. 看程序寫結果: int x = 3; int y = 4; System.out.println((++x < 2) && (y++ > 5)); // false System.out.println("x:" + x); // 4
1.6三元運算符(理解)
三元運算符語法格式: 關係表達式?表達式1:表達式2; 解釋:問號前面的位置是判斷的條件,判斷結果爲boolean型,爲true時調用表達式1,爲false時調用表達式2.其邏輯爲:如果條件表達式成立或者滿足則執行表達式1,否則執行第二個. 舉例: int a = 10; int b = 20; int c = a > b ? a : b; //判斷a > b是否爲真,如果爲真取a的值,如果爲假,取b的值. Demo: 1.需求:動物園裏有兩隻老虎,已知兩隻老虎的體重分別180kg、200kg,請用程序實現判斷這兩隻老虎的體重是否相同. public class OperatorTest01{ public static void main(String[] args){ //1.定義兩個變量用於保存老虎的體重,單位爲kg,這裏僅僅體現數值即可. int weight1 = 180; int weight2 = 200; //2.用三元運算符實現老虎體重的判斷,體重相同,返回true,否則返回false. boolean b = weight1 == weight2 ? true : false; //3.輸出結果 System.out.println("b:" + b); } } 2.需求:一座寺廟裏住着三個和尚,已知他們的身高分別是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); } }
2.數據輸入(應用)
我們可以通過Scanner類來獲取用戶的輸入.使用步驟如下: 1.導包.Scanner類在java.util包下,所以需要將該類導入.導包的語句需要定義在類的上面. import java.util.Scanner; 2.創建Scanner對象. Scanner sc = new Scanner(System.in); //創建Scanner對象,sc表示變量名,其他均不可變 3.接收數據 int i = sc.nextInt(); //表示將鍵盤錄入的值作爲int數返回. 改寫三個和尚案例,數據使用鍵盤錄入. import java.util.Scanner; public class ScannerTest{ public static void main(String[] args){ //身高未知,採用鍵盤錄入實現.首先導包,然後創建對象. Scanner sc = new Scanner(System.in); //鍵盤錄入三個身高分別賦給三個變量. System.out.println("請輸入第一個和尚的身高: "); int height1 = sc.nextInt(); System.out.println("請輸入第二個和尚的身高: "); int height2 = sc.nextInt(); System.out.println("請輸入第三個和尚的身高: "); int height3 = sc.nextInt(); //用三元運算符獲取前兩個和尚的較高身高值,並用臨時身高變量保存起來. int tempHeight = height1 > height2 ? height1 : height2; //用三元運算符獲取臨時身高值和第三個和尚身高的較高值,並用最大身高變量保存. int maxHeight = tempHeight > height3 ? tempHeight : height3; //輸出結果. System.out.println("這三個和尚中身高最高的是: " + maxHeight + "cm"); } }
3.流程控制語句(應用)
在一個程序執行的過程中,各條語句的執行順序對程序的結果是有直接影響的.所以,我們必須清楚每條語句的執行流程.而且,很多時候要通過控制語句的執行的執行順序來實現我們想要的功能.
3.1流程控制語句分類
順序結構 分支結構(if,switch) 循環結構(for, while, do...while)
3.2順序結構
順序結構是程序中最基本的流程控制,沒有特定的語法結構,按照代碼的先後順序,依次執行,程序中大多的代碼都是這樣執行的.
3.3分支結構之if語句
if語句格式1
格式: if (關係表達式){ 語句體; }
if語句格式2
格式: if (關係表達式){ 語句體1; }else{ 語句體2; }
if語句格式3
格式: if (關係表達式1){ 語句體1; }else if (關係表達式2){ 語句體2; } ... else{ 語句體n+1; }