一、順序結(jié)構(gòu)
? ? ? ? ? ? ? ? 代碼在執(zhí)行過程中如果沒有控制語句,代碼就會(huì)一句一句的執(zhí)行下去,直到結(jié)束。
二、選擇結(jié)構(gòu)
? ? ? ? ? ? ? 可分為兩種:if和switch兩種
? ? ? ? ? ? ?1、if ..else ?if-else語句或許是控制程序流程最基本的形式。其中的else是可選的
? ? ? ? ? ?格式如下:
? ? ? ? ? ?第一種結(jié)構(gòu)形式:
? ? ? ? ? ?if(boolean表達(dá)式)
? ? ? ? ? ?{
? ? ? ? ? ? ? ? ? ? ? ? ? 條件執(zhí)行體;
? ? ? ? ? ?}
? ? ? ? ? ?第二種結(jié)構(gòu)形式:
? ? ? ? ? ? ?if(boolean表達(dá)式){
? ? ? ? ? ? ? ? ? ? ? 條件執(zhí)行體A;
? ? ? ? ? ? ?}else{
? ? ? ? ? ? ? ? ? ? ? 條件執(zhí)行體B;
? ? ? ? ? ? ?}
? ? ? ? ? ?第三種結(jié)構(gòu)形式
? ? ? ? ? ?if(boolean表達(dá)式1){
? ? ? ? ? ? ? ? ? ? ? 條件執(zhí)行體A
? ? ? ? ? ?}
? ? ? ? ? else if (boolean表達(dá)式2)
? ? ? ? ? ?{
? ? ? ? ? ? ? ? ? ? ? 條件執(zhí)行體B
? ? ? ? ? ?[else if (boolean表達(dá)式)]
? ? ? ? ? ?}
? ? ? ? ? ?Else
? ? ? ? ? {
? ? ? ? ?條件執(zhí)行體C
? ? ? ? ? }
第三種if條件結(jié)構(gòu)形式分析:
? ? ? ?如果boolean表達(dá)式1結(jié)果為true,則執(zhí)行條件執(zhí)行體A,跳出判斷,否則執(zhí)行boolean表達(dá)式2。Boolean表達(dá)式2的結(jié)果為true,則執(zhí)行條件執(zhí)行體B,跳出循環(huán)。以此類推,if選擇結(jié)構(gòu)都是這樣逐一判斷下來。如果最后一個(gè)boolean表達(dá)式都為false,那么就執(zhí)行條件執(zhí)行體C。當(dāng)然過多的if也是非常不推薦的,下面就介紹switch,解決過多if的問題。
注意:Java不允許我們將一個(gè)數(shù)字作為布爾值使用,若想在一次布爾測試中使用一個(gè)非布爾值——比如在if(a)里,那么首先必須用 一個(gè)條件表達(dá)式將其轉(zhuǎn)換成一個(gè)布爾值,例如if(a!=0)。
2、Switch
“開關(guān)”(Switch)有時(shí)也被劃分為一種“選擇語句”。根據(jù)一個(gè)整數(shù)表達(dá)式的值,switch語句可從一系列 代碼選出一段執(zhí)行。它的格式如下:
switch(整數(shù)選擇因子) {
case整數(shù)值1 :語句1; break;
case整數(shù)值2 :語句2; break;
case整數(shù)值3 :語句3; break;
case整數(shù)值4 :語句4; break;
case整數(shù)值5 :語句5; break;
//..
default:語句;
}
? ? ?其中,“整數(shù)選擇因子”是一個(gè)特殊的表達(dá)式,能產(chǎn)生整數(shù)值。switch能將整數(shù)選擇因子的結(jié)果與每個(gè)整數(shù) 值比較。若發(fā)現(xiàn)相符的,就執(zhí)行對(duì)應(yīng)的語句(簡單或復(fù)合語句)。若沒有發(fā)現(xiàn)相符的,就執(zhí)行default語 句。 在上面的定義中,大家會(huì)注意到每個(gè)case均以一個(gè)break結(jié)尾。這樣可使執(zhí)行流程跳轉(zhuǎn)至switch主體的末 尾。這是構(gòu)建switch語句的一種傳統(tǒng)方式,但break是可選的。若省略break,會(huì)繼續(xù)執(zhí)行后面的case語 句的代碼,直到遇到一個(gè)break為止。就那上面的格式來說,如果將語句1,語句2后面的break去掉,當(dāng)整數(shù)因子為1時(shí),程序自然會(huì)執(zhí)行語句1,在沒有遇到break時(shí)它不會(huì)停止繼續(xù)執(zhí)行下去,語句2、語句3執(zhí)行完之后出現(xiàn)了break跳轉(zhuǎn)至switch主體的末 尾。事實(shí)上,我們可以理解為當(dāng)case選擇完成之后就不再存在了,switch主體中成為了順序結(jié)構(gòu)了,遇到break時(shí)才會(huì)跳出主體。整個(gè)注意最后的default語句沒有break,因?yàn)閳?zhí)行流程已到了break的跳轉(zhuǎn)目的地。但它要求使用一個(gè)選擇 因子,并且必須是(byte、short、int、char)這樣的整數(shù)值。對(duì)于非整數(shù)類型,則必須使用一系列if語句。
三、循環(huán)語句
1、while語句
格式:while(布爾表達(dá)式)
{
語句;
}
在循環(huán)剛開始時(shí),會(huì)計(jì)算一次“布爾表達(dá)式”的值。而對(duì)于后來每一次額外的循環(huán),都會(huì)在開始前重新計(jì)算 一次。如下從一數(shù)到十:
Int a2 = 1;
while (a2<=10)
{
System.out.println(a2);
a2++;
}
這個(gè)循環(huán)的作用是將1到10打印出來,循環(huán)剛開始a2=1與10判斷完成執(zhí)行方法體,a2自增,再與10比較于此類推直到a2=11時(shí)跳出循環(huán)。
2、do-while語句
do-while的格式如下:
do {
語句;
} while(布爾表達(dá)式);
while和do-while唯一的區(qū)別就是do-while肯定會(huì)至少執(zhí)行一次;也就是說,至少會(huì)將其中的語句“過一 遍”——即便表達(dá)式第一次便計(jì)算為false。而在while循環(huán)結(jié)構(gòu)中,若條件第一次就為false,那么其中的 語句根本不會(huì)執(zhí)行。在實(shí)際應(yīng)用中,while比do-while更常用一些。
3、for語句
for循環(huán)只進(jìn)行一次初始化。隨后,它會(huì)進(jìn)行條件測試,而且在每一次反復(fù)的時(shí)候,進(jìn)行自增或自減操作。
for循環(huán)的形式如下:
for(初始表達(dá)式;布爾表達(dá)式;循環(huán)后操作語句)
{
語句;
}
無論初始表達(dá)式,布爾表達(dá)式,還是循環(huán)后操作語句,都可以置空。每次反復(fù)前,都要測試一下布爾表達(dá)式。若獲得的 結(jié)果是false,就會(huì)繼續(xù)執(zhí)行緊跟在for語句后面的那行代碼。在每次循環(huán)的末尾,會(huì)執(zhí)行一次循環(huán)后操作語句。
//計(jì)算器從1數(shù)到10
for(int i = 1; i<=10 ; i++)
{
System.out.println(i);
}
注意變量i是在需要用到它的時(shí)候定義的——在for循環(huán)的控制表達(dá)式內(nèi)部,c的作用域是由for控制的表達(dá)式。 ?可在for語句里定義多個(gè)變量(一般選擇i,j,k,m這樣的字母定義變量)但它們必須具有同樣的類型:
for(int i = 0, j = 1; ? ? i < 10 && j != 11; ? ? i++, j++)
其中,for語句內(nèi)的int定義同時(shí)覆蓋了i和j。只有for循環(huán)才具備在控制表達(dá)式里定義變量的能力。對(duì)于 其他任何條件或循環(huán)語句,都不可采用這種方法。
4、嵌套循環(huán)
若外循環(huán)的循環(huán)次數(shù)是m次,內(nèi)循環(huán)的循環(huán)次數(shù)是n次,那么內(nèi)層循環(huán)的循環(huán)次數(shù)需要m * n次。
嵌套循環(huán)注意:
1.使用循環(huán)嵌套時(shí),內(nèi)層循環(huán)和外層循環(huán)的循環(huán)控制變量不能相同。
2.循環(huán)嵌套結(jié)構(gòu)的書寫,最好采用“右縮進(jìn)”格式,以體現(xiàn)循環(huán)層次的關(guān)系。
四、控制循環(huán)結(jié)構(gòu)
1、單個(gè)循環(huán)跳出
在任何循環(huán)語句的主體部分,亦可用break和continue控制循環(huán)的流程。其中,break用于強(qiáng)行退出循環(huán), 不執(zhí)行循環(huán)中剩余的語句。(跳出循環(huán))而continue則停止執(zhí)行當(dāng)前的反復(fù),然后退回循環(huán)起始和,開始新的反復(fù)。(跳過continue當(dāng)前這一次循環(huán)體,開始下一次循環(huán)。)return表示結(jié)束循環(huán)所在的方法,方法都結(jié)束了,循環(huán)結(jié)構(gòu)自然也就結(jié)束了,并且返回相應(yīng)的值
就以下面的程序?yàn)槔?/p>
public class Demo
{
public static void main(String[] args)
{
//在第四次的時(shí)候終止循環(huán)
for(int i = 1 ; i <10 ; i++){
if(i==5)
break;
System.out.println("我已經(jīng)輸出了"+i+"次");
if(i==4)
return ;
}
//輸出12以內(nèi)三的倍數(shù)continue循環(huán)
for(int i = 1; i<12 ; i++)
{
if(!(i%3==0))
continue;
System.out.print(i+" ?");
}
}
}
輸出結(jié)果為:
我已經(jīng)輸出了1次
我已經(jīng)輸出了2次
我已經(jīng)輸出了3次
我已經(jīng)輸出了4次
如果沒有這個(gè)代碼塊輸出結(jié)果為:
我已經(jīng)輸出了1次
我已經(jīng)輸出了2次
我已經(jīng)輸出了3次
我已經(jīng)輸出了4次
3 ?6 ?9 ?12
首先分析break,如果沒有break我們知道程序會(huì)打印出十條輸出語句,加上下一個(gè)循環(huán)輸出的:3 ?6 ?9 ?12當(dāng)加上break時(shí),系統(tǒng)輸出的結(jié)果是打印四條輸出語句加上3 ?6 ?9 ?12說明break終止了本次循環(huán)而繼續(xù)往下面執(zhí)行。對(duì)于continue如果不存在結(jié)果會(huì)打印出1到12連續(xù)的12個(gè)數(shù),當(dāng)加上continue之后,它遇到不是三的倍數(shù)就終止了本次循環(huán)繼續(xù)下一次循環(huán)得到三的倍數(shù)。說明continue只是終止本次循環(huán)繼續(xù)下一次循環(huán)。當(dāng)我在第一個(gè)for循環(huán)中加入一個(gè)return之后,下面的那個(gè)循環(huán)根本就沒有進(jìn)行, 說明return跳出的的方法體而不是這個(gè)循環(huán)語句。
2、嵌套循環(huán)跳出
唯一用到標(biāo)簽的地方是在循環(huán)語句之前。在循環(huán)之前設(shè)置標(biāo)簽的唯一理由是:希望在其中嵌套另 一個(gè)循環(huán)或者一個(gè)開關(guān)。這是由于break和continue關(guān)鍵字通常只中斷當(dāng)前循環(huán),但若隨同標(biāo)簽使用,它們 就會(huì)中斷到存在標(biāo)簽的地方。如下所示:
label1:外部循環(huán)
{
內(nèi)部循環(huán)
{
//... break; //1
//... continue; //2
//... continue label1; //3
//... break label1; //4
}
}
如果沒有break outer語句,就沒有辦法在一個(gè)內(nèi)部循環(huán)里找到出外部循環(huán)的路徑。這是由于break本身只 能中斷最內(nèi)層的循環(huán)(對(duì)于continue同樣如此)。在條件1中,break中斷內(nèi)部循環(huán),并在外部循環(huán)結(jié)束。在條件2中,continue移回內(nèi)部循環(huán)的起始處。但 在條件3中,continue label1卻同時(shí)中斷內(nèi)部循環(huán)以及外部循環(huán),并移至label1處。隨后,它實(shí)際是繼續(xù) 循環(huán),但卻從外部循環(huán)開始。在條件4中,break label1也會(huì)中斷所有循環(huán),并回到label1處,但并不重 新進(jìn)入循環(huán)。也就是說,它實(shí)際是完全中止了兩個(gè)循環(huán)。