語句塊(有時叫作複合語句),是用花括號擴起的任意數量的簡單Java語句。html
塊肯定了局部變量的做用域。塊中的程序代碼,做爲一個總體,是要被一塊兒執行的。java
塊能夠被嵌套在另外一個塊中,可是不能在兩個嵌套的塊內聲明同名的變量。dom
語句塊可使用外部的變量,而外部不能使用語句塊中定義的變量,由於語句塊中定義的變量做用域只限於語句塊。ide
1 public class Test { 2 public static void main(String[] args) { 3 int n; 4 int a; 5 { 6 int k; 7 int n; //編譯錯誤:不能重複定義變量n 8 } //變量k的做用域到此爲止 9 } 10 }
Java裏的語句可分爲如下六類post
流程控制語句是用來控制程序中各語句執行順序的語句,能夠把語句組合成能完成必定功能的小邏輯模塊。性能
控制語句分爲三類:順序、選擇和循環。
順序結構:表明「先執行a,再執行b」的邏輯。
選擇結構:表明「若是…,則…」的邏輯,
循環結構:表明「若是…,則再繼續…」的邏輯。 spa
遞歸結構:本身調用本身
迭代結構:不停調用另外一個設計
選擇結構用於判斷給定的條件,而後根據判斷的結果來控制程序的流程。 調試
有以下結構:
if單選擇結構
if-else雙選擇結構
if-else if-else多選擇結構
switch結構 code
if語句是單條件分支語句,即根據一個條件來控制程序執行的流程
if(布爾表達式){ 語句塊 }
if語句對布爾表達式進行一次斷定,
若斷定爲真,則執行{}中的語句塊,不然跳過該語句塊
if(count >= 10 && count <= 15) { //錯誤寫法:10<=count<=15 System.out.println("1"); }
注意:若是if語句不寫{},則只能做用於後面的第一條語句。
表達式的值必須是boolean型的;不能用0表明false;用1表明true;
//例子2將變量a,b,c內存中的數值按大小順序進行互換(從小到大排列)。 public class Example3_2 { public static void main(String args[]) { int a = 9,b = 5,c = 7,t=0; if(b<a) { t = a; a = b; b = t; } if(c<a) { t = a; a = c;c = t; } if(c<b) { t = b; b = c; c = t; } System.out.println("a="+a+",b="+b+",c="+c); } }
if-else 語句是雙條件分支語句,即根據一個條件來控制程序執行的流程
if(布爾表達式){ 語句塊1 }else{ 語句塊2 }
當布爾表達式爲真時,執行語句塊1,不然,執行語句塊2。也就是else部分。
if (a<b) { System.out.println(a); } else { System.out.println(b); }
注意:條件運算符有時候可用於代替if-else
System.out.println((a<b)?a:b);
if-else-if 語句是多條件分支語句,即根據多個條件來控制程序執行的流程
if(布爾表達式1) { 語句塊1; } else if(布爾表達式2) { 語句塊2; }……else if(布爾表達式n){ 語句塊n; } else { 語句塊n+1; }
當布爾表達式1爲真時,執行語句塊1;不然,判斷布爾表達式2,當布爾表達式2爲真時,執行語句塊2;不然,繼續判斷布爾表達式3······;若是1~n個布爾表達式均斷定爲假時,則執行語句塊n+1,也就是else部分。
1 if (age < 15) { 2 System.out.println("兒童"); 3 } else if (age < 25) { 4 System.out.println("青年"); 5 } else if (age < 45) { 6 System.out.println("中年"); 7 } else if (age < 65) { 8 System.out.println("中老年"); 9 } else if (age < 85) { 10 System.out.println("老年"); 11 } else { 12 System.out.println("老年"); 13 }
switch 語句是單條件多分支的開關語句
它的通常格式定義以下(其中break語句是可選的):
switch(表達式) { case 常量值1: 若干個語句 break; case 常量值2: 若干個語句 break; ... case 常量值n: 若干個語句 break; default: 若干語句 }
說明:
1)表達式的值必須是:byte,short, Int,char不能是String或者long型的; (與int兼容類型)
2)default語句放的位置是任意的。
3)檢查時case 常量必須與switch表達式 可用的類型相同。
4)switch語句會根據表達式的值從相匹配的case標籤處開始執行,
一直執行到break語句處或者是switch語句的末尾。
若是表達式的值與任一case值不匹配,則進入default語句(若是存在default語句的狀況)。
1 public class Test{ 2 public static void main(String[] args) { 3 char c = 'a'; 4 int rand = (int) (26 * Math.random()); 5 char c2 = (char) (c + rand); 6 System.out.print(c2 + ": "); 7 switch (c2) { 8 case 'a': 9 case 'e': 10 case 'i': 11 case 'o': 12 case 'u': 13 System.out.println("元音"); 14 break; 15 case 'y': 16 case 'w': 17 System.out.println("半元音"); 18 break; 19 default: 20 System.out.println("輔音"); 21 } 22 } 23 }
注意:
1)根據表達式值的不一樣能夠執行許多不一樣的操做。
switch語句中case標籤在JDK1.5以前必須是整數(long類型除外)或者枚舉,不能是字符串,
在JDK1.7以後容許使用字符串(String)。
2)當布爾表達式是等值判斷的狀況,可使用if-else if-else多選擇結構或者switch結構,
若是布爾表達式區間判斷的狀況,則只能使用if-else if-else多選擇結構。
//例子4使用了switch語句判斷用戶從鍵盤輸入的正整數是否爲中獎號碼。 import java.util.Scanner; public class Example3_4{ public static void main(String args[]) { int number = 0; System.out.println("輸入正整數(回車肯定)"); Scanner reader = new Scanner(System.in); number = reader.nextInt(); switch(number) { case 9 : case 131 : case 12 : System.out.println(number+"是三等獎"); break; case 209 : case 596 : case 27 : System.out.println(number+"是二等獎"); break; case 875 : case 316 : case 59 : System.out.println(number+"是一等獎"); break; default: System.out.println(number+"未中獎"); } } }
循環結構分兩大類,一類是當型,一類是直到型。
當型: 當布爾表達式條件爲true時,反覆執行某語句,當布爾表達式的值爲false時才中止循環,好比:while與for循環。
直到型: 先執行某語句, 再判斷布爾表達式,若是爲true,再執行某語句,如此反覆,直到布爾表達式條件爲false時才中止循環,好比do-while循環。
while (布爾表達式) { 循環體; }
在循環剛開始時,會計算一次「布爾表達式」的值,若條件爲真,執行循環體。而對於後來每一次額外的循環,都會在開始前從新計算一次。
int i = 0; int sum = 0; // 1+2+3+…+100=? while (i <= 100) { sum += i;//至關於sum = sum+i; i++; }
注意:語句中應有使循環趨向於結束的語句,不然會出現無限循環–––"死"循環。
do { 循環體; } while(布爾表達式) ;
do-while循環結構會先執行循環體,而後再判斷布爾表達式的值,若條件爲真,執行循環體,當條件爲假時結束循環。
int i = 0; int sum = 0; do { sum += i; // sum = sum + i i++; } while (i <= 100);//此處的;不能省略 System.out.println("Sum= " + sum);
注意:while與do-while的區別
do-while循環的循環體至少執行一次
public class Test{ public static void main(String[] args) { //while循環:先判斷再執行 int a = 0; while (a < 0) { System.out.println(a); a++; } System.out.println("-----"); //do-while循環:先執行再判斷 a = 0; do { System.out.println(a); a++; } while (a < 0); }
for (初始表達式; 布爾表達式; 迭代因子) { 循環體; }
for循環語句是支持迭代的一種通用結構,是最有效、最靈活的循環結構。
for循環在第一次反覆以前要進行初始化,即執行初始表達式;
隨後,對布爾表達式進行斷定,若斷定結果爲true,則執行循環體,
不然,終止循環;
最後在每一次反覆的時候,進行某種形式的「步進」,即執行迭代因子。
A. 初始化部分設置循環變量的初值
B. 條件判斷部分爲任意布爾表達式
C. 迭代因子控制循環變量的增減
for循環在執行條件斷定後,先執行的循環體部分,再執行步進。
//求1-100之間的累加和 for (int i = 0; i <= 100; i++) { sum += i; } System.out.println("Sum= " + sum);
注意:
1)在控制表達式的初始化和步進控制部分,可使用一系列由逗號分隔的表達式,並且那些表達式均會獨立執行。
1. 不管在初始化仍是在步進部分,語句都是順序執行的。
2. 儘管初始化部分可設置任意數量的定義,但都屬於同一類型。
3. 約定:只在for語句的控制表達式中寫入與循環變量初始化,條件判斷和迭代因子相關的表達式。
4.初始化部分、條件判斷部分和迭代因子能夠爲空語句,但必須以「;」分開
1 public class Test { 2 public static void main(String[] args) { 3 for(int i = 1, j = i + 10; i < 5; i++, j = i * 2) { 4 System.out.println("i= " + i + " j= " + j); 5 } 6 } 7 }
2)無限循環
for ( ; ; ) { // 無限循環: 至關於 while(true) System.out.println("北京尚學堂");) }
3)初始化變量的做用域
for ( int i=1; i<10; i++) { System.out.println("1"); } System.out.println(i+「、」) //編譯錯誤,沒法訪問在for循環中定義的變量i
在一個循環語句內部再嵌套一個或多個循環,稱爲嵌套循環。
while、do-while與for循環能夠任意嵌套多層。
for (int i=1; i <=5; i++) { for(int j=1; j<=5; j++){ System.out.print(i+" "); } System.out.println(); }
1)在任何循環語句的主體部分,都可用break控制循環的流程。
break用於強行退出循環,不執行循環中剩餘的語句。
1 public class Test { 2 public static void main(String[] args) { 3 int total = 0;//定義計數器 4 System.out.println("Begin"); 5 while (true) { 6 total++;//每循環一次計數器加1 7 int i = (int) Math.round(100 * Math.random()); 8 //當i等於88時,退出循環 9 if (i == 88) { 10 break; 11 } 12 } 13 //輸出循環的次數 14 System.out.println("Game over, used " + total + " times."); 15 } 16 }
2)continue 語句用在循環語句體中,用於終止某次循環過程,
即跳過循環體中還沒有執行的語句,
接着進行下一次是否執行循環的斷定。
注意事項
1. continue用在while,do-while中,continue 語句馬上跳到循環首部,越過了當前循環的其他部分。
2. continue用在for循環中,跳到for循環的迭代因子部分。
1 public class Test{ 2 public static void main(String[] args) { 3 int count = 0;//定義計數器 4 for (int i = 100; i < 150; i++) { 5 //若是是3的倍數,則跳過本次循環,繼續進行下一次循環 6 if (i % 3 == 0){ 7 continue; 8 } 9 //不然(不是3的倍數),輸出該數 10 System.out.print(i + "、"); 11 count++;//沒輸出一個數,計數器加1 12 //根據計數器判斷每行是否已經輸出了5個數 13 if (count % 5 == 0) { 14 System.out.println(); 15 } 16 } 17 } 18 }
3)「標籤」是指後面跟一個冒號的標識符,例如:「label:」。
對Java來講惟一用到標籤的地方是在循環語句以前。
而在循環以前設置標籤的理由是:在其中嵌套另外一個循環,
因爲break和continue關鍵字一般只中斷當前循環,
但若隨同標籤使用,它們就會中斷到存在標籤的地方。
1 public class Test { 2 public static void main(String args[]) { 3 outer: for (int i = 101; i < 150; i++) { 4 for (int j = 2; j < i / 2; j++) { 5 if (i % j == 0){ 6 continue outer; 7 } 8 } 9 System.out.print(i + " "); 10 } 11 } 12 }
4)goto關鍵字很早就在程序設計語言中出現。儘管goto還是Java的一個保留字,但並未在Java語言中獲得正式使用;Java沒有goto語句。然而,在break和continue這兩個關鍵字的身上,仍然能看出一些goto的影子---帶標籤的break和continue。
在 「goto有害」論中,最有問題的就是標籤,而非goto, 隨着標籤在一個程序裏數量的增多,產生錯誤的機會也愈來愈多。 但Java標籤不會形成這方面的問題,由於它們的活動場所已被限死,不可經過特別的方式處處傳遞程序的控制權。
1)遞歸是一種常見的解決問題的方法,即把問題逐漸簡單化。
遞歸的基本思想就是「本身調用本身」,一個使用遞歸技術的方法將會直接或者間接的調用本身。
利用遞歸能夠用簡單的程序來解決一些複雜的問題。好比:斐波那契數列的計算、漢諾塔、快排等問題。
2)遞歸結構包括兩個部分:
1.定義遞歸頭。解答:何時不調用自身方法。若是沒有頭,將陷入死循環,也就是遞歸的結束條件。
2.遞歸體。解答:何時須要調用自身方法。
1 public class Test { 2 public static void main(String[] args) { 3 long d1 = System.currentTimeMillis(); 4 System.out.printf("%d階乘的結果:%s%n", 10, factorial(10)); 5 long d2 = System.currentTimeMillis(); 6 System.out.printf("遞歸費時:%s%n", d2-d1); //耗時:32ms 7 } 8 /** 求階乘的方法*/ 9 static long factorial(int n){ 10 if(n==1){//遞歸頭 11 return 1; 12 }else{//遞歸體 13 return n*factorial(n-1);//n! = n * (n-1)! 14 } 15 } 16 }
使用循環求n! public class Test23 { public static void main(String[] args) { long d3 = System.currentTimeMillis(); int a = 10; int result = 1; while (a > 1) { result *= a * (a - 1); a -= 2; } long d4 = System.currentTimeMillis(); System.out.println(result); System.out.printf("普通循環費時:%s%n", d4 - d3); } }
3)遞歸的缺陷
簡單的程序是遞歸的優勢之一。
可是遞歸調用會佔用大量的系統堆棧,內存耗用多,
在遞歸調用層次多時速度要比循環慢的多,因此在使用遞歸時要慎重
4)注意事項
任何能用遞歸解決的問題也能使用迭代解決。
當遞歸方法能夠更加天然地反映問題,而且易於理解和調試,而且不強調效率問題時,能夠採用遞歸;
在要求高性能的狀況下儘可能避免使用遞歸,遞歸調用既花時間又耗內存。
參考:
https://www.cnblogs.com/zhizhan/p/4892886.html