java基礎 三 引用資料型別,流程控制語句
引用資料型別
1.1 Scanner類
我們要學的Scanner類是屬於引用資料型別,我們先了解下引用資料型別。
引用資料型別的使用
與定義基本資料型別變數不同,引用資料型別的變數定義及賦值有一個相對固定的步驟或格式。
資料型別 變數名 = new 資料型別();
每種引用資料型別都有其功能,我們可以呼叫該型別例項的功能。
變數名.方法名();
l Scanner類
Scanner類是引用資料型別的一種,我們可以使用該類來完成使用者鍵盤錄入,獲取到錄入的資料。
Scanner使用步驟:
導包:import java.util.Scanner;
建立物件例項:Scanner sc = new Scanner(System.in);
呼叫方法:
int i = sc.nextInt(); 用來接收控制檯錄入的數字
String s = sc.next(); 用來接收控制檯錄入的字串
瞭解完Scanner類,我們編寫程式碼來使用下它:ScannerDemo01.java
import java.util.Scanner;public class ScannerDemo01 { public static void main(String[] args) {//建立Scanner引用型別的變數 Scanner sc = new Scanner(System.in); //獲取數字 System.out.println("請輸入一個數字"); int n = sc.nextInt(); System.out.println("n的值為" + n); //獲取字串 System.out.println("請輸入一個字串"); String str = sc.next(); System.out.println("str的值為" + str); }}
1.2 隨機數類Random
用來產生隨機數的類Random,它也屬於引用資料型別。
這個Random類,它可以產生多種資料型別的隨機數,在這裡我主要介紹生成整數與小數的方式。
l 方法簡介
public int nextInt(int maxValue) 產生[0,maxValue)範圍的隨機整數,包含0,不包含maxValue;
public double nextDouble() 產生[0,1)範圍的隨機小數,包含0.0,不包含1.0。
引用資料型別的使用方式,在學習鍵盤錄入Scanner時,我們已經學習過,在這裡,再次回顧一下:
Random使用方式:
import導包:所屬包java.util.Random
建立例項格式:Random 變數名 = new Random();
接下來,通過一段程式碼,一起學習下Random類的使用,RandomDemo.java
import java.util.Random;public class RandomDemo { public static void main(String[] args) { // 建立Random類的例項 Random r = new Random(); // 得到0-100範圍內的隨機整數,將產生的隨機整數賦值給i變數 int i = r.nextInt(100); //得到0.0-1.0範圍內的隨機小數,將產生的隨機小數賦值給d變數 double d = r.nextDouble(); System.out.println(i); System.out.println(d); }}
流程控制語句
2.1 選擇結構if
接下來是if條件語句分為三種語法格式,每一種格式都有它自身的特點,下面我分別進行介紹。
2.1.1 if語句
if語句是指如果滿足某種條件,就進行某種處理。例如,小明媽媽跟小明說“如果你考試得了100分,星期天就帶你去遊樂場玩”。這句話可以通過下面的一段虛擬碼來描述。
如果小明考試得了100分 媽媽星期天帶小明去遊樂場
在上面的虛擬碼中,“如果”相當於Java中的關鍵字if,“小明考試得了100分”是判斷條件,需要用()括起來,“媽媽星期天帶小明去遊樂場”是執行語句,需要放在{}中。修改後的虛擬碼如下:
if (小明考試得了100分) { 媽媽星期天帶小明去遊樂場}
上面的例子就描述了if語句的用法,在Java中,if語句的具體語法格式如下:
if (條件語句){ 執行語句; ……}
上述格式中,判斷條件是一個布林值,當判斷條件為true時,{}中的執行語句才會執行。
接下來通過一段程式碼,學習一下if語句的具體用法,IfDemo01.java
public class IfDemo01 { public static void main(String[] args) { int x = 5; if (x < 10) { x++; } System.out.println("x=" + x); }}
在上述程式碼中,定義了一個變數x,其初始值為5。在if語句的判斷條件中判斷x的值是否小於10,很明顯條件成立,{}中的語句會被執行,變數x的值將進行自增。從執行結果可以看出,x的值已由原來的5變成了6。
2.1.2 if…else語句
if…else語句是指如果滿足某種條件,就進行某種處理,否則就進行另一種處理。例如,要判斷一個正整數的奇偶,如果該數字能被2整除則是一個偶數,否則該數字就是一個奇數。if…else語句具體語法格式如下:
if (判斷條件){ 執行語句1 ……}else{ 執行語句2 ……}
上述格式中,判斷條件是一個布林值。當判斷條件為true時,if後面{}中的執行語句1會執行。當判斷條件為false時,else後面{}中的執行語句2會執行。
接下來通過一段程式碼,來實現判斷奇偶數的程式,IfDemo02.java
public class IfDemo02 { public static void main(String[] args) { int num = 19; if (num % 2 == 0) { // 判斷條件成立,num被2整除 System.out.println("num是一個偶數"); } else { System.out.println("num是一個奇數"); } }}
上述程式碼中,變數num的值為19,模以2的結果為1,不等於0,判斷條件不成立。因此會執行else後面{}中的語句,列印“num是一個奇數”。
2.1.3 if…else if…else語句
if…else if…else語句用於對多個條件進行判斷,進行多種不同的處理。例如,對一個學生的考試成績進行等級的劃分,如果分數大於80分等級為優,否則,如果分數大於70分等級為良,否則,如果分數大於60分等級為中,否則,等級為差。if…else if…else語句具體語法格式如下
if (判斷條件1) { 執行語句1} else if (判斷條件2) { 執行語句2}...else if (判斷條件n) { 執行語句n} else { 執行語句n+1}
上述格式中,判斷條件是一個布林值。當判斷條件1為true時,if後面{}中的執行語句1會執行。當判斷條件1為false時,會繼續執行判斷條件2,如果為true則執行語句2,以此類推,如果所有的判斷條件都為false,則意味著所有條件均未滿足,else後面{}中的執行語句n+1會執行。
接下來通過一段程式碼,來實現對學生考試成績進行等級劃分的程式,IfDemo03.java
public class IfDemo03 { public static void main(String[] args) { int grade = 75; // 定義學生成績 if (grade > 80) { // 滿足條件 grade > 80 System.out.println("該成績的等級為優"); } else if (grade > 70) { // 不滿足條件 grade > 80 ,但滿足條件 grade > 70 System.out.println("該成績的等級為良"); } else if (grade > 60) { // 不滿足條件 grade > 70 ,但滿足條件 grade > 60 System.out.println("該成績的等級為中"); } else { // 不滿足條件 grade > 60 System.out.println("該成績的等級為差"); } }}
上述程式碼中,定義了學生成績grade為75。它不滿足第一個判斷條件grade>80,會執行第二個判斷條件grade>70,條件成立,因此會列印“該成績的等級為良”。
2.1.4 選擇結構if語句與三元運算轉換
三元運算子,它和if-else語句類似,語法如下:
判斷條件 ? 表示式1 : 表示式2
三元運算子會得到一個結果,通常用於對某個變數進行賦值,當判斷條件成立時,運算結果為表示式1的值,否則結果為表示式2的值。
例如求兩個數x、y中的較大者,如果用if…else語句來實現,具體程式碼如下:
int x = 0;int y = 1;int max;if (x > y) { max = x;} else { max = y;}
上面的程式碼執行之後,變數max的值為1。其中3-8行的程式碼可以使用下面的三元運算來替換。
int max = x > y ? x : y;
2.2 迴圈語句while
while迴圈語句和選擇結構if語句有些相似,都是根據條件判斷來決定是否執行大括號內的執行語句。區別在於,while語句會反覆地進行條件判斷,只要條件成立,{}內的執行語句就會執行,直到條件不成立,while迴圈結束。while迴圈語句的語法結構如下:
while(迴圈條件){執行語句………}
在上面的語法結構中,{}中的執行語句被稱作迴圈體,迴圈體是否執行取決於迴圈條件。當迴圈條件為true時,迴圈體就會執行。迴圈體執行完畢時會繼續判斷迴圈條件,如條件仍為true則會繼續執行,直到迴圈條件為false時,整個迴圈過程才會結束。
接下來通過一段程式碼,來實現列印1~4之間的自然數,WhileDemo.java
public class WhileDemo { public static void main(String[] args) { int x = 1; // 定義變數x,初始值為1 while (x <= 4) { // 迴圈條件 System.out.println("x = " + x); // 條件成立,列印x的值 x++; // x進行自增 } }}
在上述程式碼中,x初始值為1,在滿足迴圈條件x <= 4的情況下,迴圈體會重複執行,列印x的值並讓x進行自增。因此列印結果中x的值分別為1、2、3、4。
大家要注意的是,程式碼x++用於在每次迴圈時改變變數x的值,從而達到最終改變迴圈條件的目的。如果沒有這行程式碼,整個迴圈會進入無限迴圈的狀態,永遠不會結束。
2.3 迴圈語句for
for迴圈語句是最常用的迴圈語句,一般用在迴圈次數已知的情況下。for迴圈語句的語法格式如下:
for(初始化表示式; 迴圈條件; 操作表示式){
執行語句
………
}
在上面的語法結構中,for關鍵字後面()中包括了三部分內容:初始化表示式、迴圈條件和操作表示式,它們之間用“;”分隔,{}中的執行語句為迴圈體。
接下來分別用①表示初始化表示式、②表示迴圈條件、③表示操作表示式、④表示迴圈體,通過序號來具體分析for迴圈的執行流程。具體如下:
for(① ; ② ; ③){ ④}第一步,執行①第二步,執行②,如果判斷結果為true,執行第三步,如果判斷結果為false,執行第五步第三步,執行④第四步,執行③,然後重複執行第二步第五步,退出迴圈
接下來通過一個案例對自然數1~4進行求和,如下所示。ForDemo01.java
public class ForDemo01 { public static void main(String[] args) { int sum = 0; // 定義變數sum,用於記住累加的和 for (int i = 1; i <= 4; i++) { // i的值會在1~4之間變化 sum += i; // 實現sum與i的累加 } System.out.println("sum = " + sum); // 列印累加的和 }}
上述程式碼中,變數i的初始值為1,在判斷條件i<=4為true的情況下,會執行迴圈體sum+=i,執行完畢後,會執行操作表示式i++,i的值變為2,然後繼續進行條件判斷,開始下一次迴圈,直到i=5時,條件i<=4為false,結束迴圈,執行for迴圈後面的程式碼,列印“sum=10”。
為了讓初學者能熟悉整個for迴圈的執行過程,現將上述程式碼執行期間每次迴圈中變數sum和i的值通過表2-11羅列出來。
表2-1 sum和i迴圈中的值
迴圈次數 |
sum |
i |
第一次 |
1 |
1 |
第二次 |
3 |
2 |
第三次 |
6 |
3 |
第四次 |
10 |
4 |
2.4 迴圈語句do…while
do…while迴圈語句和while迴圈語句功能類似,其語法結構如下:
do {執行語句………} while(迴圈條件);
在上面的語法結構中,關鍵字do後面{}中的執行語句是迴圈體。do…while迴圈語句將迴圈條件放在了迴圈體的後面。這也就意味著,迴圈體會無條件執行一次,然後再根據迴圈條件來決定是否繼續執行。
接下來使用do…while迴圈語句來實現列印1~4之間的自然數DoWhileDemo.java。
public class DoWhileDemo { public static void main(String[] args) { int x = 1; // 定義變數x,初始值為1 do { System.out.println("x = " + x); // 列印x的值 x++; // 將x的值自增 } while (x <= 4); // 迴圈條件 }}
我們發現WhileDemo.java與DoWhileDemo.java執行的結果一致,這說明什麼呢?這說明do …while迴圈和while迴圈能實現同樣的功能。然而在程式執行過程中,這兩種語句還是有差別的。如果迴圈條件在迴圈語句開始時就不成立,那麼while迴圈的迴圈體一次都不會執行,而do…while迴圈的迴圈體還是會執行一次。若將DoWhileDemo.java中的迴圈條件x<=4改為x < 1,DoWhileDemo.java執行結果會列印x=1,而WhileDemo.java執行結果什麼也不會列印。
2.5 無限迴圈
最簡單無限迴圈格式:
while(true){}
或
for(;;){}
無限迴圈存在的原因是並不知道迴圈多少次,而是根據某些條件,來控制迴圈。
2.6 迴圈巢狀
巢狀迴圈是指在一個迴圈語句的迴圈體中再定義一個迴圈語句的語法結構。while、do…while、for迴圈語句都可以進行巢狀,並且它們之間也可以互相巢狀,如最常見的在for迴圈中巢狀for迴圈,格式如下:
for(初始化表示式; 迴圈條件; 操作表示式) { ……… for(初始化表示式; 迴圈條件; 操作表示式) { 執行語句 ……… } ………}
接下來通過一個練習,來實現使用“*”列印直角三角形,如下所示。ForForDemo.java
1 public class ForForDemo { 2 public static void main(String[] args) { 3 int i, j; // 定義兩個迴圈變數 4 for (i = 1; i <= 9; i++) { // 外層迴圈 5 for (j = 1; j <= i; j++) { // 內層迴圈 6 System.out.print("*"); // 列印* 7 } 8 System.out.print("\n"); // 換行 9 } 10 } 11 }
在上述程式碼中定義了兩層for迴圈,分別為外層迴圈和內層迴圈,外層迴圈用於控制列印的行數,內層迴圈用於列印“*”,每一行的“*”個數逐行增加,最後輸出一個直角三角形。由於巢狀迴圈程式比較複雜,下面分步驟進行詳細地講解,具體如下:
第一步,在第3行程式碼定義了兩個迴圈變數i和j,其中i為外層迴圈變數,j為內層迴圈變數。
第二步,在第4行程式碼將i初始化為1,條件i <= 9為true,首次進入外層迴圈的迴圈體。
第三步,在第5行程式碼將j初始化為1,由於此時i的值為1,條件j <= i為true,首次進入內層迴圈的迴圈體,列印一個“*”。
第四步,執行第5行程式碼中內層迴圈的操作表示式j++,將j的值自增為2。
第五步,執行第5行程式碼中的判斷條件j<=i,判斷結果為false,內層迴圈結束。執行後面的程式碼,列印換行符。
第六步,執行第4行程式碼中外層迴圈的操作表示式i++,將i的值自增為2。
第七步,執行第4行程式碼中的判斷條件i<=9,判斷結果為true,進入外層迴圈的迴圈體,繼續執行內層迴圈。
第八步,由於i的值為2,內層迴圈會執行兩次,即在第2行列印兩個“*”。在內層迴圈結束時會列印換行符。
第九步,以此類推,在第3行會列印3個“*”,逐行遞增,直到i的值為10時,外層迴圈的判斷條件i <= 9結果為false,外層迴圈結束,整個程式也就結束了。
2.7 跳轉語句(break、continue)
跳轉語句用於實現迴圈執行過程中程式流程的跳轉,在Java中的跳轉語句有break語句和continue語句。接下來分別進行詳細地講解。
1、 break語句
在switch條件語句和迴圈語句中都可以使用break語句。當它出現在switch條件語句中時,作用是終止某個case並跳出switch結構。當它出現在迴圈語句中,作用是跳出迴圈語句,執行後面的程式碼。關於在switch語句中使用break前面的例程已經用過了,接下來通過下面一段程式碼,實現將當變數x的值為3時,使用break語句跳出迴圈,程式碼如下所示。BreakDemo.java
public class BreakDemo { public static void main(String[] args) { int x = 1; // 定義變數x,初始值為1 while (x <= 4) { // 迴圈條件 System.out.println("x = " + x); // 條件成立,列印x的值 if (x == 3) { break; } x++; // x進行自增 } }}
在上述帶程式碼中,通過while迴圈列印x的值,當x的值為3時使用break語句跳出迴圈。因此列印結果中並沒有出現“x=4”。
2、 標記
當break語句出現在巢狀迴圈中的內層迴圈時,它只能跳出內層迴圈,如果想使用break語句跳出外層迴圈則需要對外層迴圈新增標記。接下來將ForForDemo.java稍作修改,控制程式只打印4行“*”,如下所示。BreakDemo02.java
public class BreakDemo02 { public static void main(String[] args) { int i, j; // 定義兩個迴圈變數 for (i = 1; i <= 9; i++) { // 外層迴圈 for (j = 1; j <= i; j++) { // 內層迴圈 if (i > 4) { // 判斷i的值是否大於4 break itcast; // 跳出外層迴圈 } System.out.print("*"); // 列印* } System.out.print("\n"); // 換行 } }}
BreakDemo02.java與ForForDemo.java實現原理類似,只是在外層for迴圈前面增加了標記“itcast”。當i>4時,使用break itcast;語句跳出外層迴圈。因此程式只打印了4行“*”。
3、 continue語句
continue語句用在迴圈語句中,它的作用是終止本次迴圈,執行下一次迴圈。接下來通過一個練習對1~100之內的奇數求和,ContinueDemo.java
public class ContinueDemo { public static void main(String[] args) { int sum = 0; // 定義變數sum,用於記住和 for (int i = 1; i <= 100; i++) { if (i % 2 == 0) { // i是一個偶數,不累加 continue; // 結束本次迴圈 } sum += i; // 實現sum和i的累加 } System.out.println("sum = " + sum); }}
上述程式碼中,使用for迴圈讓變數i的值在1~100之間迴圈,在迴圈過程中,當i的值為偶數時,將執行continue語句結束本次迴圈,進入下一次迴圈。當i的值為奇數時,sum和i進行累加,最終得到1~100之間所有奇數的和,列印“sum = 2500”。
在巢狀迴圈語句中,continue語句後面也可以通過使用標記的方式結束本次外層迴圈,用法與break語句相似,在此不再舉例說明。
猜數字案例
3.1 案例介紹
我們在日常生活中,經常與朋友們玩猜數字的遊戲,非常的有趣。現在我們通過java把這個猜數字遊戲編寫出來。
猜數字案例是要完成什麼樣的功能呢?顧名思義,這個遊戲就是你出個數字、我來猜。
遊戲操作如下:
後臺預先生成一個1-100之間的隨機數,使用者鍵盤錄入猜數字
如果猜對了,列印“恭喜您,答對了”
如果猜錯了
猜大了:列印“sorry,您猜大了!”
猜小了:列印“sorry,您猜小了!”
直到數字猜到為止
在案例開始之前,我們先要學習如下知識點:
隨機數類Random
選擇結構if
迴圈結構while
3.2 案例需求分析、
猜數字案例的需求如下:
後臺預先生成一個1-100之間的隨機數,使用者鍵盤錄入猜數字
如果猜對了,列印“恭喜您,答對了”
如果猜錯了
猜大了:列印“sorry,您猜大了!”
猜小了:列印“sorry,您猜小了!”
直到數字猜到為止
我們經過分析,得出如下的分析結果:
1.通過Random類中方法nextInt(),生成一個1-100之間的隨機數
2.輸入猜的數字
3.通過while迴圈,進行猜數字對錯判斷
猜對,跳出迴圈,遊戲結束
猜錯了,根據結果,給出提示,接著猜數字,遊戲繼續
如果猜大了,列印sorry,您猜大了!繼續下一次迴圈
如果猜小了,列印sorry,您猜小了!繼續下一次迴圈
3.3 實現程式碼步驟
分析完畢之後,在main()方法中,我們一起來完成程式碼的編寫:GuessNumber.java
public class GuessNumber { public static void main(String[] args) { //1.通過Random類中方法nextInt(),生成一個1-100之間的隨機數 int randomNumber = new Random().nextInt(100); System.out.println("隨機數已生成!"); //2.輸入猜的數字 System.out.println("----請輸入您猜的數字:----"); Scanner sc = new Scanner(System.in); int enterNumber = sc.nextInt(); //3.通過while迴圈,進行猜數字對錯判斷 //猜對,跳出迴圈,遊戲結束 while(enterNumber != randomNumber){ //猜錯了,根據結果,給出提示,接著猜數字,遊戲繼續 if(enterNumber>randomNumber) { //如果猜大了,列印sorry,您猜大了!繼續下一次迴圈 System.out.println("sorry,您猜大了!繼續下一次迴圈"); }else { //如果猜小了,列印sorry,您猜小了!繼續下一次迴圈 System.out.println("sorry,您猜小了!繼續下一次迴圈"); } //輸入猜的數字 System.out.println("----請輸入您猜的數字:----"); enterNumber = sc.nextInt(); } System.out.println("恭喜您,答對了!"); }}