計(jì)算機(jī)的組成
- 計(jì)算機(jī)硬件:眼睛看得到,手能摸得到的東西
- 中央處理器(CPU):由運(yùn)算器和控制器組成
- 存儲器
- 內(nèi)存: 內(nèi)存條(代數(shù), 睿頻)
- 外存: 硬盤(SSD: 固態(tài)硬盤, HSD: 混合盤, HDD: 機(jī)械硬盤), U盤
- 輸入設(shè)備
- 鍵盤,鼠標(biāo)
- 輸出設(shè)備
- 顯示器
- 計(jì)算機(jī)軟件:能在計(jì)算機(jī)上運(yùn)行的程序
- 系統(tǒng)軟件: Windows操作系統(tǒng), Mac操作系統(tǒng), Linux操作系統(tǒng)
- 應(yīng)用軟件: 我們程序員用編程代碼開發(fā)的軟件(例:Typora, 微信, QQ)
語言簡介
- 什么是語言?
- 指的是人與人之間進(jìn)行溝通,交互的載體,方式
- 什么是計(jì)算機(jī)語言(Computer Language)?
- 指的是人與計(jì)算機(jī)進(jìn)行交互的方式
- 計(jì)算機(jī)語言的分類
- 機(jī)器語言
簡單理解: 由二進(jìn)制0, 1這樣的指令組成.
例如: 10010表示 加法.
- 匯編語言
簡單理解: 用一些簡單的字母表示二進(jìn)制序列(0, 1)
例如: add表示 加法.
優(yōu)點(diǎn): 文件小, 執(zhí)行速度快, 可以直接操作計(jì)算機(jī)的硬件
弊端: 可讀性和可移植性相對較差, 對程序員來講, 門檻較高.
- 高級語言
簡單理解: 由一些純英文字母(包含大小寫) 和 一些特殊符號組成.
例如: +表示 加法.
優(yōu)點(diǎn): 語法相對簡單, 可讀性, 兼容性較強(qiáng), 對程序員來講, 門檻較低.
弊端: 種類繁多, 每種語言都有自己的語法, 每學(xué)一門語言, 都要學(xué)習(xí)新的語法.
分類: 1.第一代高級語言:例如C語言, 以面向過程為編程思想, 唯一一門可以直接操作計(jì)算機(jī)硬件的高級語言 2.第二代高級語言:例如C++, 以面向?qū)ο鬄榫幊趟枷? 沒有默認(rèn)的垃圾回收機(jī)制. 3.第三代高級語言:目前市場上應(yīng)用最多的語言,例如 Java, C#, 以面向?qū)ο鬄榫幊趟枷? 而且有默認(rèn)的垃圾回收機(jī)制(GC). 4.第四代高級語言: 未來的發(fā)展趨勢, 現(xiàn)在還處于發(fā)展初期簡單理解,以面向問題編程思想為主, 也就是說: 告訴計(jì)算機(jī)做什么, 而不是怎么做.例如: Siri語言交互, 大數(shù)據(jù)云平臺, 這些勢必肯定會用到大數(shù)據(jù)框架等技術(shù).
Java語言
概述
Sun公司(Stanford University NetWork: 美國的斯坦福大學(xué))在1995年推出的高級編程語言.
Java之父: 詹姆斯·高斯林(James Gosling)
Sun公司在2009年被甲骨文(Oracle)公司給收購了.
平臺版本
J2SE: 標(biāo)準(zhǔn)版, 也是其他兩個版本的基礎(chǔ). 在JDK1.5的時候正式更名為: JavaSE.
J2ME: 小型版, 一般用來研發(fā)嵌入式程序. 已經(jīng)被Android替代了. 在JDK1.5的時候正式更名為: JavaME.
J2EE: 企業(yè)版, 一般開發(fā)企業(yè)級互聯(lián)網(wǎng)程序. 在JDK1.5的時候正式更名為: JavaEE.
特點(diǎn)
1.開源:指的是Java代碼開源
2.跨平臺: 用Java代碼編寫的程序, 可以在不同的操作系統(tǒng)上運(yùn)行.(借助JVM)
3.多態(tài),多線程和面向?qū)ο?/p>
JDK和JRE
JDK: Java開發(fā)工具包(Java Development Kit), 包含開發(fā)工具 和 JRE.
常用的開發(fā)工具: javac, java
JRE: Java運(yùn)行時環(huán)境(Java Runtime Environment), 包含運(yùn)行Java程序時所需的核心類庫和 JVM.
核心類庫: java.lang, java.util, java.io
JVM: Java虛擬機(jī)(Java Virtual Machine)
PATH環(huán)境配置
1.新建一個系統(tǒng)變量: JAVA_HOME, 它的值就是你安裝的JDK的路徑(注意: 不要帶bin這一級)

2.在path中配置你剛才設(shè)置好的JAVA_HOME環(huán)境變量
解釋: %JAVA_HOME%表示引入該系統(tǒng)變量的值, 即: C:\Software\OfficeSoftware\jdk1.8.0_112
3.測試
方式一: 在DOS窗口中輸入"javac 或者 java", 能看到對應(yīng)的一坨指令即可.
方式二: 在DOS窗口中輸入"java -version", 可以看到當(dāng)前配置的JDK的版本.
JAVA程序開發(fā)步驟
1.編寫源代碼(寫指令),在后綴名為.java的源文件中編寫(讓機(jī)器識別)
2.編譯,通過javac指令實(shí)現(xiàn)HelloWorld.java(源代碼文件)->HelloWorld.class(字節(jié)碼文件)
3.運(yùn)行,java + HelloWorld(文件名)
注釋
- 單行注釋
//單行注釋
- 多行注釋
/*
多行注釋
*/
- 文檔注釋
/**
文檔注釋
*/
關(guān)鍵字
1.概述
就是被Java語言賦予了特殊含義的單詞.
2.特點(diǎn)
關(guān)鍵字是由純英文字母組成的, 而且全部都是小寫的.
常用的開發(fā)工具(Notepad++, IDEA)針對于關(guān)鍵字都會高亮顯示.
3.常用的關(guān)鍵字
public: 公共的權(quán)限, 目前先了解即可.
class: 表示在創(chuàng)建一個類.
static: 表示靜態(tài)的意思.
void: 表示方法的返回值類型.
4.定義Java源代碼文件的格式
//類名可以自定義.
public class 類名 {
public static void main(String[] args) {
System.out.println(這里的內(nèi)容可以隨便寫);
}
}
5.保留字
現(xiàn)在還不是關(guān)鍵字的單詞, 但是卻具有關(guān)鍵字的意義, 在以后的JDK升級版本中, 可能會被升級為關(guān)鍵字的單詞.例:goto, const
數(shù)據(jù)類型
- Java是一種強(qiáng)類型語言, 針對于每一個數(shù)據(jù)都給出了明確的數(shù)據(jù)類型.
- 基本數(shù)據(jù)類型分類
基本數(shù)據(jù)類型(簡稱: 基本類型)
byte, short, char, int, long, float, double, boolean
引用數(shù)據(jù)類型(簡稱: 引用類型)
String, 數(shù)組, 類, 接口, 目前先了解, 后續(xù)會詳細(xì)講解.


注意:
byte類型的取值范圍是: -128 ~ 127,char類型的取值范圍是: 0 ~ 65535
默認(rèn)的整形是: int類型, 默認(rèn)的浮點(diǎn)型(即: 小數(shù)類型)是: double類型.
定義long類型的數(shù)據(jù)時, 數(shù)據(jù)后邊要加字母L(大小寫均可), 建議加L
定義float類型的數(shù)據(jù)時, 數(shù)據(jù)后邊要加字母F(大小寫均可), 建議加F
定義變量并打印
- 定義變量, 分別記錄上述的8種基本類型數(shù)據(jù), 并將變量值打印到控制臺上.
- 思路:
- 通過聲明變量并賦值的方式實(shí)現(xiàn).
- 通過先聲明, 后賦值的方式實(shí)現(xiàn).
- 方式:
- 聲明變量并賦值.
//1. 定義一個類, 類名叫: VariableDemo02
public class VariableDemo02 {
//2. 定義main方法, 作為程序的主入口.
public static void main(String[] args) {
//3. 測試byte類型.
//3.1 定義一個byte類型的變量, 變量名叫b, 初始化值為10.
byte b = 10;
//3.2 將變量b的值打印到控制臺上.
System.out.println(b);
//4. 測試short類型.
//4.1 定義一個short類型的變量, 變量名叫s, 初始化值為20.
short s = 20;
//4.2 將變量s的值打印到控制臺上.
System.out.println(s);
//5. 測試char類型.
//5.1 定義一個char類型的變量, 變量名叫c, 初始化值為'A'.
char c = 'A';
//5.2 將變量c的值打印到控制臺上.
System.out.println(c);
//6. 測試int類型
int a = 10;
System.out.println(a);
//7. 測試long類型, 數(shù)據(jù)后記得加字母L.
long lon = 100L;
System.out.println(lon);
//8. 測試float類型, 數(shù)據(jù)后邊加字母F.
float f = 10.3F;
System.out.println(f);
//9. 測試double類型.
double d = 5.21;
System.out.println(d);
//10. 測試boolean類型.
boolean bb = true;
System.out.println(bb);
}
}
2.先聲明, 后賦值
//1. 定義一個類, 類名叫: VariableDemo03
public class VariableDemo03 {
//2. 定義main方法, 作為程序的主入口.
public static void main(String[] args) {
//3. 測試byte類型.
//3.1 定義一個byte類型的變量, 變量名叫b.
byte b;
//3.2 把數(shù)字10賦值給變量b.
b = 10;
//3.3 將變量b的值打印到控制臺上.
System.out.println(b);
//4. 測試char類型.
//4.1 定義一個char類型的變量, 變量名叫c.
char c;
//4.2 把字符'A'賦值給變量c.
c = 'A';
//4.3 將變量c的值打印到控制臺上.
System.out.println(c);
//5. 測試int類型
int a;
a = 10;
System.out.println(a);
//6. 測試double類型.
double d;
d = 5.21;
System.out.println(d);
//7. 測試boolean類型.
boolean bb;
bb = true;
System.out.println(bb);
}
}
ASCII表
1.編碼表:就是將人類的文字和一個十進(jìn)制數(shù)進(jìn)行對應(yīng)起來組成一張表格。
2.存儲字符時:需要查找ASCII碼表,找到字符對應(yīng)的數(shù)字,將數(shù)字轉(zhuǎn)換為二進(jìn)制數(shù)存放到計(jì)算機(jī)中
3.使用字符時:將對應(yīng)的二進(jìn)制數(shù)轉(zhuǎn)換為十進(jìn)制 找到ASCII表中對應(yīng)的字符 顯示出來
4.將所有的英文字母,數(shù)字,符號都和十進(jìn)制進(jìn)行了對應(yīng),因此產(chǎn)生了世界上第一張編碼表ASCII碼表.
運(yùn)算符
1.運(yùn)算符和表達(dá)式
- 運(yùn)算符:用來連接常量或者變量的符號,就叫運(yùn)算符。
- 表達(dá)式:用運(yùn)算符把常量或者變量連接起來符合java語法的句子就稱之為表達(dá)式
例如:
+(加號) 是運(yùn)算符,并且是算術(shù)運(yùn)算符。
a + b:是表達(dá)式,由于+是算術(shù)運(yùn)算符,所以這個表達(dá)式叫算術(shù)表達(dá)式。
2.分類
- 算術(shù)運(yùn)算符
指的是用來對變量或者常量進(jìn)行算術(shù)操作的,例如加減乘除等
-算數(shù)運(yùn)算符包括:
| 運(yùn)算符 | 說明 |
|---|---|
| + | 加法運(yùn)算,字符串連接運(yùn)算 |
| - | 減法運(yùn)算 |
| * | 乘法運(yùn)算 |
| / | 除法運(yùn)算 |
| % | 取模運(yùn)算,兩個數(shù)字相除取余數(shù) |
| ++ | 自增運(yùn)算符, 相當(dāng)于自身 + 1 |
| -- | 自減運(yùn)算符, 相當(dāng)于自身 - 1 |
- 賦值運(yùn)算符
| 運(yùn)算符 | 說明 |
|---|---|
| = | 賦值 a=10,將10賦值給變量a |
| += | 加后賦值 a+=b,將a+b的值給a |
| -= | 減后賦值 a-=b,將a-b的值給a |
| *= | 乘后賦值 a*=b,將a×b的值給a |
| /= | 除后賦值 a/=b,將a÷b的商給a |
| %= | 取余后賦值 a%=b,將a÷b的余數(shù)給a |
// +=符號的擴(kuò)展
public static void main(String[] args){
short s = 1;
s+=1;
System.out.println(s);
}
//s += 1 邏輯上看作是s = s + 1 計(jì)算結(jié)果被提升為int類型,再向short類型賦值時發(fā)生錯誤,因?yàn)椴荒軐⑷≈捣秶蟮念愋唾x值到取值范圍小的類型。但是,s=s+1進(jìn)行兩次運(yùn)算,+= 是一個運(yùn)算符,只運(yùn)算一次,并帶有強(qiáng)制轉(zhuǎn)換的特點(diǎn),也就是說s += 1 就是s = (short)(s + 1),因此程序沒有問題編譯通過,運(yùn)行結(jié)果是2
- 自增自減運(yùn)算符
| 運(yùn)算符 | 作用 | 說明 |
|---|---|---|
| ++ | 自增 | 變量的值加1 |
| -- | 自減 | 變量的值減1 |
1.獨(dú)立運(yùn)算:
變量在獨(dú)立運(yùn)算時,前++和后++沒有區(qū)別 。
變量前++ :例如 ++i 。
變量后++ :例如 i++ 。
2.混合運(yùn)算:
和其他變量放在一起,前++和后++就產(chǎn)生了不同。
變量前++ :變量a自己加1,將加1后的結(jié)果賦值給b,也就是說a先計(jì)算。a和b的結(jié)果都是2。
public static void main(String[] args) {
int a = 1;
int b = ++a;
System.out.println(a);//計(jì)算結(jié)果是2
System.out.println(b);//計(jì)算結(jié)果是2
}
流程控制
1.概念:
在一個程序執(zhí)行的過程中,各條語句的執(zhí)行順序?qū)Τ绦虻慕Y(jié)果是有直接影響的。所以,我們必須清楚每條語句的執(zhí)行流程。而且,很多時候要通過控制語句的執(zhí)行順序來實(shí)現(xiàn)我們想要的功能。
例如: 某些代碼是滿足特定條件的情況下, 才會被執(zhí)行. 而有些代碼, 在滿足某些條件的情況下, 需要重復(fù)執(zhí)行, 這些, 都需要用到流程控制語句.
2.分類:
- 順序結(jié)構(gòu)
- 選擇結(jié)構(gòu)(if語句, switch.case語句)
- 循環(huán)結(jié)構(gòu)(for循環(huán), while循環(huán), do.while循環(huán))
3.順序結(jié)構(gòu)

參考代碼:
public class OrderDemo01 {
public static void main(String[] args) {
//打印指定的數(shù)據(jù)
System.out.println("start");
System.out.println("HelloWorld1");
System.out.println("HelloWorld2");
System.out.println("HelloWorld13");
System.out.println("end");
}
}
選擇結(jié)構(gòu)
if語句
if語句一般用于范圍的判斷, 例如: 如果當(dāng)前時間是0~8點(diǎn), 小黑就和你說: 早上好, 如果當(dāng)前時間是9 ~12點(diǎn), 小黑就和你說: 中午好. 根據(jù)應(yīng)用場景的不同(即: 分支個數(shù)不同), if語句的格式主要分為以下三種:
1.if語句(也叫: 單分支)
2.if.else語句(也叫: 雙分支)
3.if.else if語句(也叫: 多分支)
單分支
格式:
//
if(關(guān)系表達(dá)式) {
//語句體;
}
圖解:

雙分支
雙分支結(jié)構(gòu)指的是if. else語句, 一般用來判斷兩種情況, 格式如下:
if(關(guān)系表達(dá)式) { //if的意思: 如果
//語句體1;
} else { //否則...
//語句體2;
}
圖解:

案例:判斷奇偶數(shù)
public class IfDemo03 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("請錄入一個整數(shù): ");
int num = sc.nextInt();
if (num % 2 == 0) {
System.out.println(num + "是偶數(shù)");
} else {
System.out.println(num + "是奇數(shù)");
}
}
}
多分支
案例:輸入員工工齡判斷工資
public static void main(String[] args) {
System.out.println("請輸入員工工齡:");
Scanner scanner = new Scanner(System.in);
int a = (int) scanner.nextDouble();
int wages = 0;
if(a>=10&&a<15) {
wages = 5000;
}else if(a>=5&&a<10) {
wages = 2500;
}else if(a>=3&&a<5) {
wages = 1000;
}else if(a>=1&&a<3) {
wages = 500;
}else if(a>=0&&a<1) {
wages = 200;
}else{
System.out.println("輸出錯誤");
}
System.out.println("您工作了" + a +"年"+ "," + "基本工資為3000元" + "," + "應(yīng)漲工資" + wages +
"," + "漲后工資" + (wages+3000));
}
多分支結(jié)構(gòu)
多分支結(jié)構(gòu)指的是if. else if語句, 一般用來判斷多種情況, 格式如下:
if(關(guān)系表達(dá)式1) {
//語句體1;
} else if(關(guān)系表達(dá)式2){
//語句體2;
} else if(關(guān)系表達(dá)式3){ //這里可以根據(jù)需求, 有多個else if語句
//語句體3;
} else {
//語句體n;
}
圖解:

案例一:打印星期
需求:用戶錄入[1, 7]之間的數(shù)字, 并接收,根據(jù)用戶錄入的數(shù)字, 打印對應(yīng)的星期, 格式如下:
用戶錄入1, 打印"星期一"
用戶錄入2, 打印"星期二"
...以此類推
用戶錄入非法數(shù)字, 打印"沒有這樣的日期"
參考代碼:
import java.util.Scanner;
public class IfDemo04 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("請錄入一個1 - 7之間的整數(shù): ");
int week = sc.nextInt();
if (week == 1) {
} else if(week == 2) {
System.out.println("星期二");
} else if(week == 3) {
System.out.println("星期三");
} else if(week == 4) {
System.out.println("星期四");
} else if(week == 5) {
System.out.println("星期五");
} else if(week == 6) {
System.out.println("星期六");
} else if(week == 7) {
System.out.println("星期日");
} else {
System.out.println("沒有這樣的日期, 你是從火星來的吧!");
}
}
}
案例二:發(fā)放獎勵
需求:小明快要期末考試了,小明爸爸對他說,會根據(jù)他的考試成績,送他不同的禮物.禮物標(biāo)準(zhǔn)如下:
90~100 山地自行車一輛
80~89 游樂場玩一次
70~79 變形金剛玩具一個
70以下 胖揍一頓
import java.util.Scanner;
public class SwitchDemo09 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("請錄入小明的考試成績: ");
int score = sc.nextInt();
if (score >= 0 && score <= 100) {
//合法成績
switch (score / 10) {
case 10:
case 9:
System.out.println("獎勵小明: 山地自行車一輛");
break;
case 8:
System.out.println("獎勵小明: 游樂場玩兒一次");
break;
case 7:
System.out.println("獎勵小明: 變形金剛玩具一個");
break;
default:
System.out.println("獎勵小明: 男女雙混組合拳 + 掃帚棒法");
break;
}
} else {
//非法成績
System.out.println("您錄入的成績有誤!");
}
}
}
案例三: 水仙花數(shù)
需求:鍵盤錄入一個三位數(shù)字,輸出該三位數(shù)字是否是水仙花數(shù)字?水仙花數(shù)字要求: 指的是一個三位數(shù),個位、十位、百位的數(shù)字立方和等于原數(shù)
例如 153 333 + 555 + 111 = 27 + 125 + 1 = 153
public static void main(String[] args) {
System.out.println("請輸入一個三位數(shù):");
Scanner scanner = new Scanner(System.in);
int number = scanner.nextInt();
int a = number/100;
int b = (number - a*100)/10;
int c = number % 10;
if(number>=100 && number<1000){
if(a*a*a + b*b*b + c*c*c == number){
System.out.println(number + "是水仙花數(shù)");
}else{
System.out.println(number + "不是水仙花數(shù)");
}
}else{
System.out.println("輸入錯誤,必須為三位數(shù)!");
}
}
循環(huán)結(jié)構(gòu)
1.概述:
循環(huán),即事物周而復(fù)始的變化。循環(huán)結(jié)構(gòu)指的是,使一部分代碼按照次數(shù)或一定的條件反復(fù)執(zhí)行的一種代碼結(jié)構(gòu). 有些時候, 我們想代碼是在滿足某些條件的情況下, 重復(fù)(循環(huán))執(zhí)行的, 就需要用到循環(huán)結(jié)構(gòu)了.
例如: 打印100次HelloWorld. 如果不用循環(huán)實(shí)現(xiàn)的話, 輸出語句我們就需要寫100次, 我們發(fā)現(xiàn)這樣做是非常繁瑣的. 于是, 我們可以通過循環(huán)來優(yōu)化它.
2.組成
- 初始化條件:假設(shè)用int類型的變量x記錄循環(huán)次數(shù),x從1開始數(shù), 數(shù)到100剛好100次, 1在這里充當(dāng)?shù)慕巧褪? 初始化條件.
- 判斷條件:變量x從1開始數(shù), 數(shù)到100結(jié)束. 即: x <= 100, 這就是判斷條件, 用來決定循環(huán)是否繼續(xù)執(zhí)行的.
- 控制條件:用來控制變量x變化的. 每循環(huán)一次, 變量x的值+1. 即: x++就是控制條件.
- 循環(huán)體:指的是需要重復(fù)執(zhí)行的代碼, 例如: System.out.println("Hello World!");
3.分類
- for循環(huán):一般適用于循環(huán)次數(shù)固定的情況.
格式:
for(初始化條件1; 判斷條件2; 控制條件3) {
//循環(huán)體4;
}
圖解:

案例一:把 1~ 100 之間的數(shù)字 按照一行6個進(jìn)行輸出
public class Text04 {
public static void main(String[] args) {
int count = 0;
for(int i=1;i<=100;i++){
count++;
System.out.print(i + " ");
if(count%6 == 0){
System.out.println();
}
}
}
}
案例二:輸出1000~9999的所有(個+百=十+千),每行6個輸出,并計(jì)算數(shù)量
public static void main(String[] args) {
int count = 0;
for(int i=9999;i>=1000;i--){
int ge = i%10;
int shi = (i%100 - ge)/10;
int bai = (i/100)%10;
int qian = i/1000;
if(ge + bai == shi + qian){
count++;
System.out.print(i+ " ");
if(count % 5 == 0){
System.out.println();
}
}
}
System.out.println("數(shù)量為" + count);
}
案例三: 獲取所有水仙花數(shù)
(解釋:水仙花數(shù)是一個3位數(shù)的整數(shù).
該數(shù)字的各個位數(shù)立方和相加等于它本身.
例如: 153就是水仙花數(shù), 153 = 1 * 1 * 1 + 5 * 5 * 5 + 3 * 3 * 3 = 153)
public class ForDemo05 {
public static void main(String[] args) {
int ge, shi, bai;
for (int i = 100; i < 1000; i++) {
ge = i / 1 % 10;
shi = i / 10 % 10;
bai = i / 100 % 10;
if (i == ge * ge * ge + shi * shi * shi + bai * bai * bai)
System.out.println(i);
}
}
}
案例四: 求和 + 計(jì)數(shù)(獲取1 - 100之間的奇數(shù)和, 以及奇數(shù)的個數(shù).)
//需求: 獲取1 - 100之間的奇數(shù)和, 以及奇數(shù)的個數(shù).
public class ForDemo07 {
public static void main(String[] args) {
int count = 0;
int sum = 0;
for (int i = 1; i <= 100 ; i++) {
if (i % 2 != 0) {
sum += i;
count++;
}
}
System.out.println("1-100之間的奇數(shù)個數(shù)為: " + count + ", 這些奇數(shù)的總和為: " + sum);
}
}
- while循環(huán):一般適用于循環(huán)次數(shù)不固定的情況.
- do.while循環(huán):我們在實(shí)際開發(fā)中, 基本不用. 適用于先執(zhí)行一次, 然后判斷的情況.
循環(huán)跳轉(zhuǎn)
概述
有些時候, 我們想提前終止循環(huán)的執(zhí)行, 或者跳過循環(huán)的某一次執(zhí)行, 例如: 打印1~10之間, 所有不是3倍數(shù)的數(shù)字, 或者采用死循環(huán)讓用戶不斷的錄入他/她的賬號和密碼, 直到用戶錄入正確, 再終止循環(huán). 這些都要用到循環(huán)控制跳轉(zhuǎn)知識點(diǎn).
分類
- break: 是用來終止循環(huán)的, 循環(huán)不再繼續(xù)執(zhí)行.
- continue: 用來結(jié)束本次循環(huán), 進(jìn)行下一次循環(huán)的, 循環(huán)還會繼續(xù)執(zhí)行.
案例一: break入門
參考代碼:
//案例: 打印10次`HelloWorld`, 當(dāng)打印第五次的時候, 結(jié)束循環(huán).
public class BreakDemo01 {
public static void main(String[] args) {
System.out.println("start");
//1. 定義for循環(huán), 打印10次HelloWorld
for (int i = 1; i <= 10 ; i++) {
//2.當(dāng)i等于5的時候, 結(jié)束循環(huán)
if (i == 5)
break;
System.out.println("Hello World! " + i);
}
System.out.println("end");
}
}
圖解:

案例二: continue入門
參考代碼:
//案例; 打印1~10之間, 所有不是3倍數(shù)的整數(shù).
public class ContinueDemo02 {
public static void main(String[] args) {
System.out.println("start");
//1. 通過for循環(huán), 獲取1 - 10之間所有的整數(shù)
for (int i = 1; i <= 10; i++) {
//2. 判斷該數(shù)字是否是3的倍數(shù).
if (i % 3 == 0)
//3. 如果是, 就結(jié)束本次循環(huán)
continue;
//4. 如果不是, 就打印該數(shù)字的值.
System.out.println(i);
}
System.out.println("end");
}
}
圖解:

循環(huán)嵌套
概念
所謂的循環(huán)嵌套指的是循環(huán)結(jié)構(gòu)中還包裹著循環(huán)結(jié)構(gòu), 外邊的循環(huán)結(jié)構(gòu)叫外循環(huán), 里邊的循環(huán)結(jié)構(gòu)叫內(nèi)循環(huán).
格式
循環(huán)嵌套用的最多的就是for循環(huán)的嵌套, 具體格式如下:
for(初始化條件; 判斷條件; 控制條件) { //外循環(huán), 例如: 5 1 2
for(初始化條件; 判斷條件; 控制條件) { //內(nèi)循環(huán), 例如: 3 1,2,3 1,2,3
//循環(huán)體;
}
}
執(zhí)行流程
1.外循環(huán)執(zhí)行一次, 內(nèi)循環(huán)執(zhí)行一圈.
2.循環(huán)嵌套的總執(zhí)行次數(shù) = 外循環(huán)的次數(shù) * 內(nèi)循環(huán)的次數(shù).
例如:
現(xiàn)實(shí)世界中的年月關(guān)系, 即: 1年 = 12個月
現(xiàn)實(shí)世界中的時分, 分秒關(guān)系, 即: 1小時 = 60分鐘, 1分鐘=60秒.
案例
案例一:打印2020年1月至2023年12月之間所有的月份, 格式為: XXXX年XX月
//不使用嵌套
// xxx年 xx月
public static void main(String[] args) {
for(int i =1; i < 12; i++){
System.out.println("2020年" + i + "月\t");
}
for(int i =1; i < 12; i++){
System.out.println("2021年" + i + "月\t");
}
for(int i =1; i < 12; i++){
System.out.println("2022年" + i + "月\t");
}
}
//使用嵌套
public static void main(String[] args) {
//簡單寫法
//控制年份
for(int i = 2020; i <=2023 ; i++){
//控制月份
for (int j = 0; j <= 12; j++) {
System.out.print(i + "年" + j + "月\t");
}
System.out.println();
}
}
}
案例二:打印1天內(nèi)的所有時間, 格式: 13時14分.
public static void main(String[] args) {
for (int i = 0; i <= 23 ; i++) {
for (int j = 0; j < 60; j++) {
System.out.print(i + "時" + j + "分\t");
}
System.out.println();
}
}
案例三:在控制臺打印一個3行5列的矩形星星序列
public static void main(String[] args) {
//打印矩形 3*5
//外層負(fù)責(zé)換行,里層負(fù)責(zé)打印
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 5; j++) {
System.out.print("*");
}
System.out.println();
}
}
案例四: 打印正三角形(在控制臺打印一個5行5列的正三角形星星序列, 具體格式如下)
public static void main(String[] args) {
for (int i = 1; i <= 5; i++) {
for (int j = 1; j < i+1; j++) {
System.out.print("*");
}
System.out.println();
}
}
案例五: 打印倒三角形(在控制臺打印一個5行5列的正三角形星星序列)
public static void main(String[] args) {
for (int i = 1; i <= 5; i++) {
for (int j = 0; j <= 5-i; j++) {
System.out.print("*");
}
System.out.println();
}
}
案例六: 打印99乘法表
public static void main(String[] args) {
for (int i = 1; i <10 ; i++) {
for (int j = 1; j <= i ; j++) {
System.out.print(i + "*" + j + "=" + i*j + "\t");
}
System.out.println();
}
}
帶標(biāo)號的循環(huán)操作
參考代碼:
public class ForForDemo10 {
public static void main(String[] args) {
for (int i = 1; i <= 5; i++) { //外循環(huán), 控制行. i的值: 1,
for (int j = 1; j <= 5 ; j++) { //內(nèi)循環(huán), 控制列. j的值: 1,2,3(整個循環(huán)結(jié)束)
if (j == 3) {
break; //這個break, 是用來結(jié)束哪個循環(huán)呢?
}
System.out.print("*");
}
System.out.println();
}
}
}
上述的代碼, 打印結(jié)果是一個5行2列的矩形星星圖案, 而我的需求是獲取一個1行2列的星星圖案, 這就意味著, 上述代碼中的break, 只要能直接結(jié)束外循環(huán)即可.
實(shí)際開發(fā)中, 為了方便我們操作循環(huán)嵌套中的指定循環(huán), 就需要用到帶標(biāo)號的循環(huán)操作了.
格式
A: for(初始化條件; 判斷條件; 控制條件) { //外循環(huán)
B: for(初始化條件; 判斷條件; 控制條件) { //內(nèi)循環(huán)
循環(huán)體;
}
}
案例一: break用法
//優(yōu)化上述的代碼, 改為打印一個1行2列的星星圖案.
public class ForForDemo10 {
public static void main(String[] args) {
A: for (int i = 1; i <= 5; i++) { //外循環(huán), 控制行.
B: for (int j = 1; j <= 5 ; j++) { //內(nèi)循環(huán), 控制列.
if (j == 3) {
break A; //這個break, 是用來結(jié)束哪個循環(huán)呢?
}
System.out.print("*");
}
System.out.println();
}
}
}
案例二: continue用法
//打印1~100之間所有的質(zhì)數(shù), 并按照3個一行的形式進(jìn)行輸出.
//解釋:
//質(zhì)數(shù)指的是只能被1及它自身整除的數(shù)字. 例如: 2, 3, 5, 7, 11, 13
//最小的質(zhì)數(shù)是2
//該題的目的是演示: 帶標(biāo)號的循環(huán)的continue操作.
public static void main(String[] args) {
//打印1~100之間所有的質(zhì)數(shù), 并按照3個一行的形式進(jìn)行輸出.
//定義變量, 用來記錄1-100之間的 質(zhì)數(shù)個數(shù).
int count = 0;
//定義變量, 用來記錄一行打印幾個數(shù).
int flag = 3;
a: for (int i = 2; i < 100; i++) {
for (int j = 2; j < i ; j++) {
if (i % j == 0) {
//走到這里, 說明i不是質(zhì)數(shù).
continue a;
}
}
System.out.print(i + (++count % flag == 0 ? "\r\n" : "\t"));
}
}
}
生成隨機(jī)數(shù)
1.概念
Random類似Scanner,也是Java提供好的API(Application Programming Interface),內(nèi)部提供了產(chǎn)生隨機(jī)數(shù)的功能. API后續(xù)課程詳細(xì)講解,現(xiàn)在可以簡單理解為Java已經(jīng)寫好的代碼, 我們可以直接拿來用.
2.使用步驟
//導(dǎo)入包
import java.util.Random;
//創(chuàng)建隨機(jī)數(shù)Random對象.
Random r = new Random();
//調(diào)用方法, 產(chǎn)生隨機(jī)數(shù)
int num = r.nextInt(10); //小括號中可以傳入任意的正整數(shù)
double num = r.nexDouble(); // [0, 1.0)之間的任意小數(shù)
boolean num = r.nextBoolean(10); // 生成均等的布爾值
例:
public static void main(String[] args) {
//創(chuàng)建RanDom對象
Random random = new Random();
//調(diào)用隨機(jī)數(shù)方法
//生成[0,num) 之間的任意整數(shù) 不包括num
for (int i = 0; i < 10; i++) {
int num1 = random.nextInt(1);
System.out.println(num1);
}
//生成[0~1)之間任意浮點(diǎn)數(shù)
double num2 = random.nextDouble();
System.out.println(num2);
//生成概率均等的布爾值
boolean num3 = random.nextBoolean();
System.out.println(num3);
//該方法的作用是重新設(shè)置Random對象中的種子數(shù)。
//設(shè)置完種子數(shù)以后的Random對象和相同種子數(shù)使用
//new關(guān)鍵字創(chuàng)建出的Random對象相同。
r.setSeed()
public void setSeed(long seed)
}
解釋:
小括號中寫的整數(shù)是生成的隨機(jī)數(shù)的上限.
例如: 小括號中寫10 , 說明生成0~10之間的隨機(jī)數(shù), 包含0, 但是不包含10, 即: 包左不包右.
小括號中必須傳入正整數(shù), 否則會報IllegalArgumentException(非法參數(shù)異常).
Random的使用
案例一:使用Random類,生成5個10以內(nèi)的隨機(jī)整數(shù), 并將結(jié)果打印到控制臺.
import java.util.Random;
public class RandomDemo01 {
public static void main(String[] args) {
//1. 創(chuàng)建Random對象.
Random r = new Random();
//2. 定義for循環(huán), 用來獲取3個隨機(jī)數(shù).
int num;
for (int i = 1; i <= 3; i++) {
//3. 調(diào)用r.nextInt(數(shù)字)方法, 獲取具體的隨機(jī)數(shù).
num = r.nextInt(10);
System.out.println(num);
}
}
}
案例二:生成隨機(jī)職業(yè)
import java.util.Random;
import java.util.Scanner;
public class RandomDemo03 {
public static void main(String[] args) {
/*
1. 提示用戶錄入他/她的名字并接收.
2. 通過隨機(jī)數(shù), 來打印用戶上輩子的職業(yè).
3. 0: 宰相, 1: 一品帶刀侍衛(wèi), 2:皇帝, 3: 大內(nèi)總管, 4: 店小二, 5: 江湖郎中
*/
//1. 創(chuàng)建Random類的對象.
Random r = new Random();
//2. 提示用戶錄入他/她的名字并接收.
Scanner sc = new Scanner(System.in);
System.out.println("請錄入您的姓名, 我來算一下您上輩子的職業(yè): ");
String name = sc.nextLine();
//3. 生成一個0-5之間的隨機(jī)數(shù).
int num = r.nextInt(6);
String occupation = "";
switch (num) {
case 0:
occupation = "宰相";
break;
case 1:
occupation = "一品帶刀侍衛(wèi)";
break;
case 2:
occupation = "皇帝";
break;
case 3:
occupation = "大內(nèi)總管";
break;
case 4:
occupation = "店小二";
break;
case 5:
occupation = "宰相";
break;
default:
System.out.println("江湖郎中");
break;
}
//4. 根據(jù)生成的隨機(jī)數(shù), 打印用戶上輩子的職業(yè).
System.out.println("您好, " + name + ", 經(jīng)過大數(shù)據(jù)分析, 您上輩子的職業(yè)是: " + occupation);
}
}
