程式設計日記:Java學習之路(三)
3.Java分支語句
3.1資料型別轉換
Java是強型別的語言,資料的型別和儲存資料的變數的型別必須一致。
那麼int型別的變數能不能儲存byte型別的資料呢?
byte型別的變數能不能儲存int型別的資料呢?
一般情況下,小的資料可以放在大的資料型別中,JVM可以實現自動型別轉換。
如果要把大的資料放進小的變數中,需要手動型別轉換:
變數=(變數型別)值;
int a = 10; byte b = (byte)a;
注意:
(1)手動型別轉換有可能會造成資料丟失
·大整型轉變為小整型:拋棄高位元組,保留低位元組
·浮點轉變為整型:拋棄小數部分,保留整數部分
·雙精度浮點轉變為單精度浮點:損失資料精度
(2)不是所有的型別都能手動進行型別轉換
·boolean型別不能和其他基本型別互相轉換
自動型別提升:兩個數值參與運算,會發生自動型別提升
規則:參與運算的兩個數值:如果有double型別,運算結果為double型別,如果有float型別,運算結果為float型別,如果有long型別,運算結果為long型別,否則運算結果為int型別
3.2運算子
運算子分為數學運算子,賦值運算子,布林運算子,位運算子和三元運算子
數學運算子:+,-,*,/(兩個整型運算的結果還是整型,小數部分被捨棄),%
賦值運算子:=:把右邊的值賦給左邊的變數
注意:左邊必須是變數不能是表示式或者常數
賦值運算子:+=,-=,*=,/=,%=……
自增自減運算子:++,--,此類運算子不會發生自動型別提升。
布林運算子:
==:判斷兩邊的值是否相等,相等則值為true,否則值為false
<,<=,>,>=,!=:判斷不等式是否成立
布林運算子:
!:邏輯非:!false = true !true = false
&&:邏輯與 同真為真
||:邏輯或 有真為真
位運算子:
&、|既是位運算子,也是邏輯運算子,作用和&&、||相同。
&&、||是短路運算子
&、|是非短路運算子
短路運算:當一個子表示式的值能決定整個表示式的值時,後面的所有子表示式的值不再計算。
三元運算子:a?b:c
規則:a為布林表示式,b和c為同一型別的表示式或值,當a為ture時,整個表示式為b的值,否則為c的值。(表示式是可以巢狀的)
3.3順序語句
Java中的語句分為:順序語句,分支語句,迴圈語句,控制語句,在Java中使用分號表示一個語句的結束。
順序語句:
(1)賦值語句:給變數賦值
(2)輸入語句:把資料傳入到Java虛擬機器內部
(3)輸出語句:把Java虛擬機器內部的資料傳出
(4)函式呼叫語句:執行一段特定的程式碼
輸入語句:
Scanner scanner = new Scanner(System.in); int a = scanner.nextInt(); double d = scanner.nextDouble(); String s1 = scanner.next(); String s2 = scanner.nextLine(); scanner.close();
輸出語句:
System.out.println(10); System.out.println("10"); System.out.println(); System.out.print(10); System.out.print("10"); System.out.print();
3.4分支語句
當某個條件滿足時才執行某個程式碼塊
if語句:
if(布林表示式){ }
if(布林表示式){ }else{ }
多分支的if語句:在if和else之間,可以寫若干個else if,使if語句實現多個分支:
if ( 布林表示式 ) {……} // 第一個分支 else if( 布林表示式 ) {……} // 第二個分支 else if( 布林表示式 ) {……} // 第三個分支 else {……} // 第四個分支
if else語句是可以進行巢狀使用的,也就是if else語句中還可以寫if else語句
switch語句:
if (a == 1) { System.out.println("a = 1"); } else if (a == 2) { System.out.println("a = 2"); } else if (a == 3) { System.out.println("a = 3"); } else { System.out.println("error"); }
if語句還是存在一些問題的,比如,如果所有的if/else語句中if語句中的布林表示式都為false,會導致程式碼的執行效率低,這個時候我們就可以選擇使用switch語句來進行選擇分支
// ① switch( 表示式 ) { case 值1: // ② case 值2: // ③ case 值3: // ④ } // ⑤
switch語句表示式的型別:byte,short,int,char,java.lang.String,列舉,不能是boolean型別
case後面值的型別:必須是常量或者列舉值,不能是表示式
switch語句存在的問題:
在每一個分支中的程式碼塊執行完以後,不會跳出switch語句,而是會繼續執行下一個分支中的程式碼塊,直到整個switch語句執行完為止。
如果想在執行完一個程式碼塊後就跳出switch語句,需要在每個分支的程式碼塊最後增加break語句。
如果表示式的值和case後面的值都不相等,可以使用default子句,這時會執行default後面的程式碼塊。
switch語句總結:可以有多個case子句,最多有一個default子句,case和default子句的順序無關緊要。
在switch語句中可以巢狀switch語句,同時也可以和if語句相互巢狀
3.5練習
(1)從鍵盤輸入一個表示年份的正整數,輸出此年份是平年還是閏年。請使用至少兩種方法實現。
import java.util.Scanner; public class Java_day03_01 { public static void main(String[] args){ Scanner year = new Scanner(System.in); int years = year.nextInt(); if(years%400==0){ System.out.println("閏年"); } else if (years%4==0 && years%100!=0){ System.out.println("閏年"); } else{ System.out.println("平年"); } } }
(2)從鍵盤輸入一個表示百分制分數的正整數,請使用switch語句實現按以下規則輸出中文分數:
100~90:優 89~80:良 79~70:中
69~60:及格 59~0:不及格 其它:錯誤
import java.util.Scanner; public class Java_day03_02 { public static void main(String[] args){ Scanner s = new Scanner(System.in); int num = s.nextInt(); switch (num/10){ case 0: case 1: case 2: case 3: case 4: case 5:System.out.println("不及格");break; case 6:System.out.println("及格");break; case 7:System.out.println("中");break; case 8:System.out.println("良");break; case 9: case 10:System.out.println("優");break; default:System.out.println("錯誤");break; } } }
(3)從鍵盤輸入任意三個整數,請使用三元運算子找出這三個整數中的最大值並輸出。
import java.util.Scanner; public class Java_day03_03 { public static void main(){ Scanner a = new Scanner(System.in); int q = a.nextInt(); int w = a.nextInt(); int e = a.nextInt(); int max = q>w?q:w; max = max<e?e:max; System.out.println(max); } }