一、選擇語句【switch語句】:
概述:提前把一些結果對應的處理方式寫好,執行的時候根據表達式的結果去和羅列好的結果去匹配,對應執行匹配的結果的處理方式的語句體。
格式:
switch(表達式){
case 常量1:語句體1;
break;
case 常量2:語句體2;
break;
......
case 常量n:語句體n;
break;
default: 語句體n+1;
break;
}
格式解釋:
switch:選擇的意思 做選擇
表達式:他的結果表示所作出的選擇
case項:供給我們來選擇的選項
語句體:每一項對應要干的事
break:用來結束選擇。
執行流程:
1、執行表達式得到表達式的結果
2、使用結果去和下面的case項一一的匹配一直到匹配上結果值執行對應的語句體
3、執行break中斷選擇語句
代碼示例
import java.util.Scanner; public class Demo01 { public static void main(String[] args) { //鍵盤錄入一個時間值表示游戲技能的冷卻
Scanner sc = new Scanner(System.in); System.out.println("請輸入冷卻的時間:"); int time = sc.nextInt(); //switch語句來選擇技能
switch (time) { case 10: System.out.println("技能是:大殺四方"); break; case 15: System.out.println("技能是:崩山裂地斬"); break; case 20: System.out.println("技能是:血魔弒天"); break; case 30: System.out.println("技能是:諸神獻祭"); break; case 40: System.out.println("技能是:暗天波動眼"); break; default: System.out.println("沒有找到對應的技能"); break; } } }
注意事項:
1、表達式結果類型:
jdk1.5版本前:byte、short、char、int
jdk1.5版本:增加了枚舉類型
jdk1.7版本:增加了String
2、case項后只能跟常量,不能跟變量
3、case項中的break,一般情況下不能省略,他是結束選擇語句的。
如果省略了break,就不會及時的結束選擇語句會繼續執行下一個case項的語句體
這樣的現象我們叫做case的穿透性。
如果多個case項的語句體是一樣的,那就可以利用穿透性
4、default項表示表達式的結果沒有對應的匹配case項來執行的語句體;
永遠都是最后一個區匹配。
練習
-
鍵盤錄入一個月份,輸出這個月份的季節,
-
說明:345月為春季,678為夏季 ,9、10、11為秋季,12、1、2為冬季 其他數字沒有任何季節錄入錯誤
代碼示例
import java.util.Scanner; public class Test01 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("請輸入月份值:"); int month = sc.nextInt(); switch (month) { case 3: case 4: case 5: System.out.println("春天"); break; case 6: case 7: case 8: System.out.println("夏天"); break; case 9: case 10: case 11: System.out.println("秋天"); break; case 12: case 1: case 2: System.out.println("冬天"); break; default: System.out.println("您輸入的月份不合法"); break; } } }
二、循環結構
- 概述:就是使用固定的格式來重復做一件事情的格式語句,叫做循環結構語句。
- 常用語句分類:for循環結構;while循環結構
for循環
- 格式:for(初始化變量;循環條件;初始化變量的自增){循環體}
- 解釋:
- for:關鍵字 代表循環
- 初始化變量:決定循環從什么地方開始【可以初始化多個變量,變量於變量之間使用逗號隔開】
- 循環條件:決定循環的事什么情況下可以做
- 初始化變量的自增:決定循環的次數【頻率】
- 循環體:循環要做的那件事【重復做的那件事情】
1、練習1
打印數字1-5
分析:動作是不是就是打印 這是一個重復動作所以就可以使用循環
從哪里開始打印:從內容1開始打印 初始化變量就是int 變量值就是1 ,變量就是打印的內容
明確循環條件:內容 1到5 不是這范圍的內容就不打印 變量小於等於5就可以
打印:
初始化變量的自增:第二次打印的內容比第一次的內容增加了1,變量加1
循環體:打印內容值 輸出語句輸出變量
代碼示例
public class For_Test01 { public static void main(String[] args) { //打印1到5
for (int i = 1; i < = 5; i++) { //打印內容值 i就表示是內容值
System.out.println(i); } } }
2、練習2
打印數字5-1
分析:動作是不是就是打印 這是一個重復動作所以就可以使用循環
從哪里開始打印:從內容5開始打印 初始化變量就是int 變量值就是5 ,變量就是打印的內容
明確循環條件:內容 5到1 不是這范圍的內容就不打印 變量大於0就可以打印
初始化變量的自增:第二次打印的內容比第一次的內容減少了1,變量減去1
循環體:打印內容值 輸出語句輸出變量
代碼示例
public class For_Test02 { public static void main(String[] args) { //打印5到1
for (int i = 5; i > 0; i--) { //打印內容值 i就表示是內容值
System.out.println(i); } } }
3、練習3
計算1+2+3+...+100的和
分析:累加必須是兩個數相加后使用結果去加第三個數,然再用新的結果去加第四個數,依次去加下個數,加完最后一個數得到結果是不是就是 最終的累和結果。
每次相加都是結果加下一個數:這個動作要做多次 重復的動作,使用循環從數1開始加 初始化變量就是數1,操作的內容就應該是數,現在使用變量來表示
初始化變量自增:變量只需要加1
循環條件:數不大於100 變量小於等於100;
循環體:使用結果去加數 但是沒有結果,在循環外定義一個結果。從1開始加的時候結果就是0.
代碼示例
public class For_Test03 { public static void main(String[] args) { //定義一個變量來存放每次相加得到的結果
int sum = 0; //重復做結果加數字的動作
for (int i = 1; i <= 100; i++) { //每次使用結果值加數字把新的結果存放到結果的變量sum
sum = sum + i; } System.out.println("1到100的累和是:"+sum); } }
4、練習4
計算1-100的偶數和
分析:
累加之前對數進行判斷;是偶數我才加,不是偶數跳過累加必須是兩個數相加后使用結果去加第三個數,然再用新的結果去加第四個數,依次去加下個數,加完最后一個數得到結果是不是就是最終的累和結果。
每次相加都是結果加下一個數:這個動作要做多次 重復的動作,使用循環從數1開始加 初始化變量就是數1,操作的內容就應該是數,現在使用變量來表示
初始化變量自增:變量只需要加1
循環條件:數不大於100 變量小於等於100;
循環體:使用結果去加數 但是沒有結果,在循環外定義一個結果。從1開始加的時候結果就是0.
代碼示例
public class For_Test04 { public static void main(String[] args) { //定義一個變量來存放每次相加偶數得到的結果
int sum = 0; //重復做結果加數字的動作
for (int i = 1; i <= 100; i++) { //i變量代表的就是數字 要數字進行判斷 判斷i是不是偶數就可以了
if (i % 2 == 0) { //每次使用結果值加數字偶數把新的結果存放到結果的變量sum
sum = sum + i; } } System.out.println("1到100之間偶數的累和是:"+sum); } }
5、練習5
列舉所有的“四葉玫瑰數”,並統計四葉玫瑰數的個數
四葉玫瑰數:是一個四位數,各個位的數字的四次方的和,為該數字本身
分析:
四葉玫瑰數他是存在什么范圍的數字,四位數:1000到9999
操作的數的范圍就是1000到9999
獲取四葉玫瑰數:需要一個數一個數去判斷,對每個數的判斷重復的動作使用循環語句。初始化變量:從1000開始判斷,初始化變量就是從1000開始,這個變量就表示操作的數,循環條件就是數的范圍 變量大於1000同時小於等於9999,初始化變量的自增:就是數加一。
循環體:就是判斷數是不是四葉玫瑰數
1、先獲取四位數每一位上面的數字
個位:數%10 結果就是個位的數
十位:數/10%10就是十位上的數
百位:數/100%10就是百位上的數
千位:數/1000
2、求取四個數的四次方和
3、判斷和是否等於數本身
4、條件成立,進行計數。
如何來計數:使用唯一的容器來記錄次數最后的次數就是最終的次數在循環的外面定義一個唯一的變量,初始值是0.每記錄一次就更新一下變量中的值【就是最新的次數】
代碼示例
public class For_Test05 { public static void main(String[] args) { //定義一個變量來存儲每次出現四葉玫瑰數的次數
int count = 0; //判斷所有的四位數
for (int i = 1000; i < = 9999; i++) { //對數字進行判斷 //獲取每一個位上的數據
int g = i%10;//個位 1234 1234%10 余數 :4
int s = i/10%10;//十位 1234 1234/10 =123%10 余數 3
int b = i/100%10;//百位
int q = i/1000;//千位 //求取四個數的四次方的和
int sum = g*g*g*g+s*s*s*s+b*b*b*b+q*q*q*q; if (sum == i) { System.out.println("四葉玫瑰數是:"+i); //條件滿足i就是四葉玫瑰數 進行計數
count++; } } System.out.println("四葉玫瑰數的個數為"+count); } }
while循環
- 概述:它是循環結構一種,它也有自己的固定格式,它的執行流程和for循環的執行流程一樣,所以把while循環理解為是for循環的一種。
- 格式:
- 初始化變量;
- while(循環條件){循環體;初始化變量的自增}
- 解釋:while:關鍵字 含義和for的含義基本一樣。表示循環
練習1
使用while循環,統計1-100范圍內,有多少數字可以被7整除
分析:操作1到100的數字,對每一個數字進行判斷,是否被7整除,從1開始做,初始化變量就是定義為1,變量就是代表操作的數字。
循環條件:數字在1到100之間 就進行判斷。
循環體:對數字[變量]進行判斷。使用數對7 進行取余數,余數為0意味着整除,對能整除的數字進行個數的計數[就是循環外面定義一個唯一的變量來計數]
初始化變量的自增:每次增加1
代碼示例package com.ujiuye.demo; public class Demo_While {
public static void main(String[] args) { //操作的是1到100數從1開始操作 //定義一個初始化變量1 int num = 1; //定義一個唯一的變量來記錄個數 int count = 0 ; while (num <= 100) { //對數進行判斷是否被7整除
if (num % 7 == 0) {
//進行計數
count++;}
//初始化變量的自增【特別容易丟】
num++; } //循環完成之后count當中存放的就是能被7 整除的數的個數
System.out.println("1到100之間能被7整數的數的個數:"+count); } }
練習2
珠穆拉瑪峰的高度為8848米,一張紙的厚度為0.01米,請問折疊多少次,紙張能達到珠穆拉瑪峰的高度。
分析:
紙對折一次厚度翻倍*=2
什么時候不用對折了?紙的厚度>=8848 [循環條件就是<8848]
循環體:對紙進行對折 [紙的厚度翻倍]
初始化變量就是紙的厚度,
初始化變量的自增:每次都是翻倍,*=2;
代碼示例:
public class While_Test02 { public static void main(String[] args) { //定義珠穆拉瑪峰高度
int heigth = 8848; //定義一個紙的厚度
double num = 0.01; //定義一個變量來進行計數
int count = 0 ;
while (num<heigth) { //對折紙
num*=2;
System.out.println(num); //執行一次高度沒有珠穆拉瑪峰高進行一次計數
count++; } //循環完成之后count中就是 折的次數對
System.out.println("紙的厚度超越珠穆拉瑪峰的高度需要對折"+count+"次"); } }
死循環
- 概述:就是循環條件永遠成立,循環體會一致執行下去的現象,叫做死循環。
- 使用場景:要做的事不想停止,一致做下去。
- for循環結構: for ( ; ture ; ) {循環體}
- while 循環結構 :[常用] while (true){循環體}
- 弊端:一直執行不停止,容易產生內存溢出的異常出現。
代碼示例
public class Demo01 { public static void main(String[] args) { /*for(;;) { System.out.println("情人節快樂"); }*/ while(true) { System.out.println("情人節快樂"); } } }
跳轉語句
- 概述:在循環執行過程中,我想人為的干預循環的過程使用的工具,工具叫做跳轉語句。
- break:停止整個循環語句體
- continue:停止當前[本次] 循環,繼續下一次循環。
代碼示例
public class Demo { public static void main(String[] args){
for(int i = 1;i<=5; i++) { //當打印到三的 候就不打印時/*if (i>=3) {break;//結束整個循環體 }*/ //當i是3的時候不打印3,其他正常打印if (i==3) { continue; //跳過本次循環繼續執行后面的循環 } System.out.println(i); } } }
綜合練習
模擬用戶登錄,正確的用戶名是123,密碼是987
提示用戶錄入用戶名和密碼,進行判斷,如果錄入正確就提示“登錄成功”;如果錄入錯誤就提示“登錄失敗,請重新錄入”
如果登錄失敗,就繼續錄入,直到登錄成功為止
分析:
使用到循環 [死循環]
只有輸入對了,結束錄入 [結束死循環 break]
循環體:
1,鍵盤錄入用戶名和密碼
2,判斷錄入的信息和正確信息是否一致
3,對,結束登錄 [結束循環體]
4,不對,重新登錄
代碼示例
import java.util.Scanner; public class Login { public static void main(String[] args) { //先定義正確的用戶名和密碼
int username = 123;
int password =987; //開啟鍵盤錄入功能
Scanner sc = new Scanner(System.in); //書寫死循環
while(true) { //友好提示錄入用戶名
System.out.println("請輸入您的用戶名:"); int uname = sc.nextInt(); System.out.println("請輸入您的密碼:"); int upassWord = sc.nextInt(); //驗證
if (uname==username && upassWord == password) { //驗證成功提示登錄成功信息
System.out.println("恭喜您,來到天堂"); //結束整個循環體
break; } else { System.out.println("您的信息有誤,請重新登錄!"); } } } }
嵌套循環
-
概述:就是一個循環的循環體是另一個循環體。
舉例:教練員要求運動員跑3次1500米,操場500米一圈,運動員1500米需要跑3圈 教練員的要求 跑3次事重復指令 使用到循環。
指令是循環體同時也是運動員要干的事
運動員干的事:跑3圈,也是一個循環。
運動員的循環作為教練員循環的循環體出現,這樣的現象就是嵌套式循環。
代碼示例
public class Demo02 { public static void main(String[] args) { //書寫教練員的指令3次指令
for(int i = 1 ; i <= 3; i++) { //指令的內容【運動員跑1500米需要跑3圈一圈一圈的跑】
for(int j = 1; j <= 3; j++){ System.out.println("每次跑一圈500米"); } System.out.println("完成第"+i+"指令"); } } }
嵌套循環練習
1、練習1
使用嵌套循環,打印四行五列星星矩形 ***** ***** ***** ***** 提示:打印不換行,使用print方法,不要加ln
分析:
1,先把整行看成一個整體內容是一個a提議就變成打印4行a使用循環打印
2,把a的內容替換成*****五個*也是一個一個打印出來 [使用循環來打印]
代碼示例
public class Test01 { public static void main(String[] args) { //先打印4行a for(int i = 1; i <=4 ;i++) { //System.out.println("a");//內容a //內層循環【外層循環的循環體】打印的就是***** for (int j = 1; j <= 5; j++){ System.out.print("*"); } //打印完一行***** 之后換行 System.out.println(); } } } 解釋: println():打印完內容自動換行 print(): 打印完內容不會換行
2、練習2
使用嵌套循環,打印5行5列的直角三角形 * ** *** **** *****
分析:
1,把每一行的內容看做一個相同元素 首先打印5行相同的元素
2,把每行的內容換成真實的內容
第一行:*
第二行:**
第三行:***
每行打印的*的個數和行數是相等。
代碼示例
public class Test02 { public static void main(String[] args) { //打印5行內容 for (int i = 1; i <= 5; i++) { //打印每一行的內容每行* 個數小於等於對應的行數就打印 for (int j = 1; j <= i; j++) { // 打印* System.out.print("*"); } //打印完一行需要 行換System.out.println(); } } }
三、方法
-
概述:就是一段具有特殊功能的代碼段
-
表現為:使用固定格式把特殊功能的代碼封裝起來,並起個名,下次使用的時候直接找這個名字,就能使用這段代碼,這個叫做方法。
- 本質:就是一點具有特殊功能的代碼段。
- 好處:
1、簡化了代碼的重復性,提高了代碼的復用性;
2、提高了代碼的安全性
3、提升了開發效率,維護性提升
方法的定義
- 格式:修飾符 返回值類型 方法名稱(參數列表){方法體}
- 修飾符:目前情形下 public static
- 返回值類型:代碼段執行完畢得到的結果的數據類型 [基本數據類型] ,如果代碼段執行完畢沒有數值,相當於沒有數據類型,返回值類型使用void來 代替數據類型。void 不是數據類型。
- 方法名:就是特殊代碼段起的名字 [為了將來使用代碼段好找]
- (參數列表):就是特殊代碼段執行的時候會使用到一些數據,用來存放這些數據的一個變量空間。
- 方法體:就是我們那段特殊功能的代碼。
- 沒有返回值:直接就是方法體 [執行完畢只是一種效果,沒有值]
- 有返回值:寫完方法體,return語句;[執行完畢有一個數值,值需要使用return 返回給調用者]
- 定義位置:類中方法外
代碼示例
public class Test02 { public static void main(String[] args) { } //類中方法外
public static void printStar() { //打印5行內容
for (int i = 1; i <= 5; i++) { //打印每一行的內容每行* 個數小於等於對應的行數就打印
for (int j = 1; j <= i; j++){ // 打印*
System.out.print("*");
} //打印完一行需要 行換
System.out.println();
} } }
練習:
創建一個求取兩個int類型的數的和的方法
//定義好了一個求和的方法 public static int getSum(int a,int b) {
int c = a+b; return c ; }
方法的調用
- 格式:方法名稱(實際參數)
- 表現方式:
(1) 直接調用: 方法名稱(實際參數)
(2) 輸出調用: 把方法調用放到輸出語句中:System.out.println(getSum(12,23))
注意事項:調用的方法必須要有返回值
(3) 賦值調用:把方法調用賦值給一個變量 int sum = getSum(12,23);
(4) 注意事項:調用的方法必須要有返回值
- 方法的注意事項
-
方法定義:
(1)方法不能嵌套定義,方法都是定義在主方法的下面。 (2)方法的先后沒有區別 (3)方法的定義是平級關系 (4)方法可以嵌套調用,甚至可以自己調用自己
參數列表
-
形式參數
-
概述:就是存在於方法的定義中,是一個沒有被賦值的變量,具有數據類型修飾的
- 特點:
- 存在方法的定義參數列表中
- 是變量的聲明 [沒有被賦值的變量]
- 肯定有數據類型的修飾【變量有數據類型】
比如:
getSum(int a,int b){} //int a 和int b就是形式參數。
實際參數
- 概述:方法調用的時候傳入的值【對方法形式參數的回應(對變量賦值)】存在方法的調用中,是一個常量值或者是一個對象 [具體的東西]
- 特點:
- 存在於方法的調用中
- 是一個常量
- 沒有數據類型修飾
比如:getSum(34,56) 34 和56 就是實際參數
四,方法在內存中的理解
- 寄存器:與CPU打交道的
- 本地方法棧:與操作系統打交道的
- 棧內存:與方法 ,局部變量打交道的
- 堆內存:與對象,成員變量打交道
- 方法區:與類,接口,枚舉等數據打交道的
過程:
1、加載字節碼文件到方法區
2、調用main方法進棧開始執行
3、main方法中調用其他方法,到方法區找對應的方法進棧開始執行
4、方法執行完彈棧並把值彈給main方法
方法練習
1、練習1
- 定義一個方法getMax,可以獲取兩個整數的較大值
- 在主方法中,鍵盤錄入兩個整數,調用方法獲取兩者最大值
代碼示例
import java.util.Scanner; public class Method_Test01 { //定義一個求取兩個數的最大值的一個方法 public static int getMax(int a, int b) {
int max = a>b ? a : b ; return max ; } public static void main(String[] args) { //主方法 //鍵盤錄入整數 Scanner sc = new Scanner(System.in); //友好提示輸入整數 System.out.println("請輸入第一個整數:"); int num1 = sc.nextInt(); System.out.println("請輸入第二個整數:"); int num2 = sc.nextInt(); //調用方法獲取num1和num2的最大值 int max = getMax(num1, num2); System.out.println("您輸入的兩個數的最大值是:"+max); } }
2、練習2
- 定義一個方法isEqual,可以判斷兩個小數是否相等
- 在主方法中,鍵盤錄入兩個整數,自動提升為小數,調用方法比較兩者是否相等
- 代碼示package com.ujiuye.demo; import java.util.Scanner; public class Method_Test02 {
public static void main(String[] args){ //鍵盤錄入整數
Scanner sc = newScanner(System.in); //友好提示輸入整數
System.out.println("請輸入第一個整數:"); int num1 = sc.nextInt(); System.out.println("請輸入第二個整數:"); int num2 = sc.nextInt(); //整數提升為double的數小 轉大
double a = num1; double b = num2; System.out.println(a); System.out.println(b); //調用方法比較這兩個數
boolean c = isEqual(a, b);
System.out.println("輸入的兩個數是否相等"+c); }
//定義一個方法isEqual,可以判斷兩個小數是否相等
public static boolean isEqual(doublea,doubleb){
//判斷a 和b 里面的數
if (a == b ) {
return true;
}else {
return false;
}
}
}
3、練習3
- 定義一個方法,可以打印指定行數和列數的矩形
- 在主方法中,鍵盤錄入兩個整數,作為行數和列數,調用方法打印對應規模的矩形
代碼示例
public static void main(String[] args) { /*//先打印4行a //for(int i = 1; i <=4 ;i++) { //System.out.println("a"); //內容a//內層循環【外層循環的循環體】打印的就是***** //for (int j = 1; j <= 5; j++) { // System.out.print("*"); } //打印完一行***** 之后換行 //System.out.println(); }*/ printStar(6,6); } //定義方法打印n行m列的巨型* public static void printStar(int n ,int m) { //先打印n行a for(int i = 1; i <=n ;i++) { //System.out.println("a");//內容a //內層循環【外層循環的循環體】打印的就是***** for (int j = 1; j <= m; j++){
System.out.print("*"); } //打印完一行***** 之后換行 System.out.println(); } } }