1 JRE和JDK
1.1 JRE(Java Runtime Environment)
是Java程式運作時的環境,包含JVM和運作時所需要的核心類庫。
我們想要運作一個已有的Java程式,那麼隻需要安裝JRE即可。
1.2 JDK(Java Development Kit)
是Java程式開發工具包,包含JRE和開發人員所需要使用的工具。
其中的開發工具:編譯工具(javac.exe)和運作工具(java.exe)。
1.3 JDK、JRE和JVM的關系
1.4 JDK的安裝目錄
目錄名稱 | 說明 |
bin | 該路徑下存放了JDK的各種工具指令。javac和java就放在這個目錄 |
conf | 該路徑下存放了JDK的相關配置檔案 |
include | 該路徑下存放了一些平台特定的頭檔案 |
jmods | 該路徑下存放了JDK的各種子產品 |
legal | 該路徑下存放了JDK各子產品的授權文檔 |
lib | 該路徑下存放了JDK工具的一些補充JAR包 |
其餘檔案為說明性文檔。
2 基礎文法
2.1 注釋
2.1.1 注釋概述
- 注釋是在程式指定位置添加的說明性問題。
- 注釋不參與程式運作,僅起到說明作用。
2.1.2 注釋分類
- 單行注釋
- 格式:// 注釋資訊
- 多行注釋
- 格式:/* 注釋資訊 */
- 文檔注釋
- 格式:/** 注釋資訊 */
2.2 關鍵字
2.2.1 關鍵字概述
關鍵字:就是被Java語言賦予了特定含義的單詞。
2.2.2 關鍵字的特點
- 關鍵字的字母全部小寫。
- 常用的代碼編輯器,針對關鍵字有特殊的顔色标記,非常直覺。
2.3 常量
2.3.1 常量概述
常量:在程式運作過程中,其值不可以發生改變的量。
2.3.2 常量分類
常量類型 | 說明 |
字元串常量 | 用雙引号括起來的内容 |
整數常量 | 不帶小數的數字 |
小數常量 | 帶小數的數字 |
字元常量 | 用單引号括起來的内容 |
布爾常量 | 布爾值,表示真假 |
空常量 | 一個特殊的值,空值,不能直接輸出 |
2.4 資料類型
2.4.1 計算機存儲單元
我們知道計算機是可以用來存儲資料的,但是無論是記憶體還是硬碟,計算機儲存設備的最小資訊單元叫"位(bit)“,我們又稱之為"比特位”,通常用小寫的字母"b"表示。而計算機中最小的存儲單元叫"位元組(byte)",通常用大寫字母"B"表示,位元組是由連續的8個位組成。
2.4.2 資料類型
Java語言是強類型語言,對于每一種資料都給出了明确的資料類型,不同的資料類型也配置設定了不同的記憶體空間,是以他們表示的資料大小也是不一樣的。
2.4.3 資料類型記憶體占用和取值範圍
2.5 變量
2.5.1 變量概述
變量:在程式運作過程中,其值可以發生改變的量。從本質上講,變量是記憶體中一小塊區域。
2.5.2 變量的定義
格式:資料類型 變量名 = 變量值;
2.5.3 變量的使用
取值和修改值
- 取值格式:變量名
- 修改值格式:變量名 = 變量值;
2.5.4 變量的注意事項
- 在同一個方法中,不可重複定義變量
- 變量未指派不可使用
- 定義long類型,為防止整數過大,變量值最後面加上L,例如: long a = 100000000L;
- 浮點數預設是double類型,為了防止類型不相容,定義float類型,在變量值最後面加上F,例如: float a = 13.14F;
2.6 辨別符
2.6.1 辨別符概述
辨別符:就是給類、方法、變量等起名字的符号。
2.6.2 辨別符定義的規則
- 由數字、字母、下劃線、和美元符組成
- 不能以數字開頭
- 不能是關鍵字
- 區分大小寫
2.6.3 常見命名約定
小駝峰命名法:方法、變量
- 約定1:辨別符是一個單詞的時候,首字母小寫
- 約定2:辨別符由多個單詞組成的時候,第一個單詞首字母小寫,其餘單詞首字母大寫
大駝峰命名法:類
- 約定1:辨別符是一個單詞的時候,首字母大寫
- 約定2:辨別符由多個單詞組成的時候,每個單詞首字母大寫
2.7 類型轉換
2.7.1 類型轉換分類
- 自動類型轉換
- 強制類型轉換
2.7.2 自動類型轉換
把一個表示資料範圍小的數值或者變量指派給另一個表示資料範圍大的變量
2.7.3 強制類型轉換
把一個表示範圍大的數值或者變量指派給另外一個表示資料範圍小的變量
- 格式:目标資料類型 變量名 = (目标資料類型)值或者變量;
3 運算符
3.1 算術運算符
3.1.1 運算符和表達式
- 運算符:對常量或者變量進行操作的符号
-
表達式:用運算符把常量或者變量連接配接起來符合java文法的式子就可以成為表達式。
不同運算符連接配接起來的表達式展現的是不同類型的表達式。
算術表達式中包含多個基本資料類型的值的時候,整個算術表達式的類型會自動進行提升。
- 提升規則:
- byte類型、short類型和char類型将被提升到int類型。
- 整個表達式的類型自動提升到表達式中最高等級操作數同樣的類型。
- 等級順序: byte, short, char -> int -> long -> float -> double
3.2 指派運算符
- 符号:=
- 作用:指派
- 擴充指派運算符:+=、*=、-=、/=、%=
注意:擴充的指派運算符隐含了強制類型轉換
3.3 自增自減運算符
符号 | 作用 | 說明 |
++ | 自增 | 變量值加1 |
– | 自減 | 變量值減1 |
3.4 關系運算符
符号 | 說明 |
== | a==b,判斷a和b的值是否相等,成立為true,不成立為false |
!= | a!=b,判斷a和b的值是否不相等,成立為true,不成立為false |
> | a>b,判斷a是否大于b,成立為true,不成立為false |
>= | a>=b,判斷a是否大于等于b,成立為true,不成立為false |
< | a<b,判斷a是否小于b,成立為true,不成立為false |
<= | a<=b,判斷a是否小于等于b,成立為true,不成立為false |
3.5 邏輯運算符
3.5.1 邏輯運算符概述
邏輯運算符,是用來連接配接關系表達式的運算符,當然邏輯運算符也可以直接連接配接布爾類型的變量或常量
3.5.2 邏輯運算符
符号 | 作用 | 說明 |
& | 邏輯與 | a&b,a和b都是true,結果為true,否則為false |
| | 邏輯或 | a|b,a和b都是false,結果為false,否則為true |
^ | 邏輯異或 | a^b,a和b不同為true,相同為false |
! | 邏輯非 | !a,結果和a的結果正好相反 |
3.5.3 短路邏輯運算符
符号 | 作用 | 說明 |
&& | 短路與 | 作用和&相同,但是有短路效果,左邊為false,右邊不執行 |
|| | 短路或 | 作用和|相同,但是有短路效果,左邊為true,右邊不執行 |
注意事項:
-
邏輯與&,無論左邊真假,右邊都要執行。
短路與&&,如果左邊為真,右邊執行,如果左邊為假,右邊不執行。
-
邏輯或|,無論左邊真假,右邊都要執行。
短路或||,如果左邊為假,右邊執行,如果左邊為真,右邊不執行。
3.6 三元運算符
3.6.1 三元運算符
- 格式:關系表達式 ? 表達式1 : 表達式2;
- 計算規則:
- 首先計算關系表達式的值
- 如果值為true,表達式1的值就是運算結果
- 如果值為false,表達式2的值就是運算結果
4 資料輸入
1.1 Scanner使用的基本步驟
- 導包
import java.util.Scanner;
// 導包的動作必須出現在類定義的上邊
- 建立對象
Scanner sc = new Scanner(System.in);
// 上面這個格式裡面,隻有sc是變量名,可以變,其它的都不允許變
- 接收參數
int i = sc.next();
// 上面這個格式裡面,隻有i是變量名,可以變,其它的都不允許變
5 分支語句
5.1 流程控制
5.1.1 流程控制語句分類
- 順序結構
- 分支結構(if,switch)
- 循環結構(for,while,do…while)
5.1.2 順序結構
順序結構是程式中最簡單最基本的流程控制,沒有特定的文法結構,按照代碼的先後順序,依次執行,程式中大多數的代碼都是這樣執行的。
5.2 if語句
5.2.1 if語句格式1
if (關系表達式) {
語句體;
}
執行流程:
- 首先計算關系表達式的值
- 如果關系表達式的值為true就執行語句體
- 如果關系表達式的值為false就不執行語句體
- 繼續執行後面的語句内容
5.2.2 if語句格式2
if (關系表達式) {
語句體1;
} else {
語句體2;
}
執行流程:
- 首先計算關系表達式的值
- 如果關系表達式的值為true就執行語句體1
- 如果關系表達式的值為false就執行語句體2
- 繼續執行後面的語句内容
5.2.3 if語句格式3
if (關系表達式1) {
語句體1;
} else if (關系表達式2) {
語句體2;
}
...
else {
語句體n+1;
}
執行流程:
- 首先計算關系表達式1的值
- 如果值為true就執行語句體1;如果值為false就計算關系表達式2的值
- 如果值為true就執行語句體2;如果值為false就計算關系表達式3的值
- …
- 如果沒有任何關系表達式為true,就執行語句體n+1。
5.3 switch語句
5.3.1 switch語句格式
switch (表達式) {
case 值1:
語句體1;
break;
case 值2:
語句體2;
break;
...
default:
語句體n+1;
[break;]
}
格式說明:
- 表達式: 取值為byte、short、int、char,JDK5以後可以是枚舉,JDK7以後可以是String.
- case: 後面跟的是要和表達式進行比較的值。
- break: 表示中斷,結束的意思,用來結束switch語句。
- default: 表示所有情況都不比對的時候,就執行該處的内容,和if語句的else相似。
6 循環語句
6.1 for循環語句
6.1.1 循環結構
- 特征:
- 重複做某件事情
- 具有明确的開始和停止标志
- 循環結構的組成:
- 初始化語句: 用于表示循環開啟時的起始狀态,簡單說就是循環開始的時候什麼樣
- 條件判斷語句: 用于表示循環反複執行的條件,簡單說就是判斷循環是否能一直執行下去
- 循環體語句: 用于表示循環反複執行的内容,簡單說就是循環反複執行的事情
- 條件控制語句: 用于表示循環執行中每次變化的内容,簡單說就是控制循環是否能執行下去
- 循環結構對應的文法:
- 初始化語句: 這裡可以是一條或者多條語句,這些語句可以完成一些初始化操作
- 條件判斷語句: 這裡使用一個結果值為boolean類型的表達式,這個表達式能決定是否執行循環體。例如: a<3
- 循環體語句: 這裡可以是任意語句,這些語句将反複執行
- 條件控制語句:這裡通常是使用一條語句來改變變量的值,進而達到控制循環是否繼續向下執行的效果。常見i++,i–這樣的操作
6.1.2 for循環語句格式
for (初始化語句; 條件判斷語句; 條件控制語句) {
循環體語句;
}
執行流程:
- 執行初始化語句
- 執行條件判斷語句,看其結果是true還是false
- 如果是false,循環結束
- 如果是true,繼續執行
- 執行循環體語句
- 執行條件控制語句
- 回到2繼續
6.2 while循環語句
6.2.1 while循環語句格式
// 基本格式
while (條件判斷語句) {
循環體語句;
}
// 完整格式
初始化語句;
while (條件判斷語句) {
循環體語句;
條件控制語句;
}
執行流程:
- 執行初始化語句
- 執行條件判斷語句,看其結果是true還是false
- 如果是false,循環結束
- 如果是true,繼續執行
- 執行循環體語句
- 執行條件控制語句
- 回到2繼續
6.3 do…while循環語句
6.3.1 do…while循環語句格式
// 基本格式
do {
循環體語句;
} while (條件判斷語句);
// 完整格式
初始化語句;
do {
循環體語句;
條件控制語句;
} while (條件判斷語句);
執行流程:
- 執行初始化語句
- 執行循環體語句
- 執行條件控制語句
- 執行條件判斷語句,看其結果是true還是false
- 如果是false,循環結束
- 如果是true,繼續執行
- 回到2繼續
6.3.2 三種循環的差別
- 三種循環的差別
- for循環和while循環先判斷條件是否成立,然後決定是否執行循環體(先判斷後執行)
- do…while循環先執行一次循環體,然後判斷條件是否成立,是否繼續執行循環體(先執行後判斷)
- for和while的差別
- 條件控制語句所控制的自增變量,因為屬于for循環的文法結構,在for循環結束後,就不能再次通路到了
- 條件控制語句所控制的自增變量,對于while循環來說不歸屬于其文法結構中,在while循環結束後,該變量還可以繼續使用
死循環格式:
for (;;) { }
while (true) { }
do { } while (true);
while的死循環格式是最常用的
指令提示符視窗中Ctrl+C可以結束死循環
6.4 跳轉控制語句
6.4.1 跳轉控制語句概述
- continue: 用在循環中,基于條件控制,跳過某次循環體内容的執行,繼續下一次的執行
- break: 用在循環中,基于條件控制,終止循環體内容的執行,也就是說結束目前的整個循環
6.5 循環嵌套
6.5.1 循環嵌套概述
語句結構:
- 順序語句:
- 以分号結尾,表示一句話的結束
- 分支語句:
- 一對大括号表示if的整體結構,整體描述一個完整的if語句
- 一對大括号表示switch的整體結構,整體描述一個完整的switch語句
- 循環語句:
- 一對大括号表示for的整體結構,整體描述一個完整的for語句
- 一對大括号表示while的整體結構,整體描述一個完整的while語句
- do…while以分号結尾,整體描述一個完整的do…while語句
任何語句對外都可以看成一句話,一句代碼
分支語句中包含分支語句稱為分支嵌套
循環語句中包含循環語句稱為循環嵌套
6.6 Random
6.6.1 Random的作用和使用步驟
作用: 用于産生一個随機數
使用步驟:
- 導包
import java.util.Random;
// 導包的動作必須出現在類定義的上邊
- 建立對象
Random r = new Random();
// 上面這個格式裡面,隻有r是變量名,可以變,其它的都不允許變
- 擷取随機數
int number = r.nextInt(10); // 擷取資料的範圍: [0, 10) 包括0,不包括10
// 上面這個格式裡面,number是變量名,可以變,10可以變,其它的都不允許變
7 數組
7.1 數組定義格式
7.1.1 數組概述
數組(array)是一種用于存儲多個相同類型資料的存儲模型。
7.1.2 數組的定義格式
-
格式一: 數組類型[] 變量名
範例: int[] arr
定義一個int類型的數組,數組名是arr
-
格式二: 數組類型 變量名[]
範例: int arr[]
定義一個int類型的變量,變量名是arr數組
7.2 數組初始化之動态初始化
7.2.1 數組初始化概述
Java中的數組必須先初始化才能使用。
所謂初始化:就是将數組中的數組元素配置設定記憶體空間,并為每個數組元素指派。
7.2.2 數組初始化方式
- 動态初始化
- 靜态初始化
7.2.3 動态初始化
動态初始化:初始化時隻指定數組長度,由系統為數組配置設定初始值
- 格式: 資料類型[] 變量名 = new 資料類型[數組長度];
- new: 為數組申請記憶體空間;
7.3 數組元素通路
- 數組變量通路方式
- 格式: 數組名
- 數組内部儲存的資料的通路方式
- 格式: 數組名[索引]
- 索引是數組中資料的編号方式
- 作用: 索引用于通路數組中的資料使用,數組名[索引]等同于變量名,是一種特殊的變量名
- 特征:
- 索引從0開始
- 索引是連續的
- 索引逐一增加,每次加1
7.4 記憶體配置設定
7.4.1 Java中記憶體配置設定
- 棧記憶體: 存儲局部變量
- 定義在方法中的變量,使用完畢,立即消失
- 堆記憶體: 存儲 new 出來的内容(實體,對象)
- 數組在初始化時,會為存儲空間添加預設值
- 每一個new出來的東西都有一個位址值,使用完畢,會在垃圾回收器空閑時被回收
7.5 數組初始化之靜态初始化
7.5.1 數組初始化之靜态初始化
- 格式: 資料類型[] 變量名 = new 資料類型[]{資料1, 資料2, 資料3, …};
- 範例: int[] arr = new int[]{1, 2, 3};
- 簡化格式: 資料類型[] 變量名 = {資料1, 資料2, 資料3, …};
- 範例: int[] arr = {1, 2, 3};
7.6 數組操作的兩個常見小問題
- 索引越界: 通路了數組中不存在的索引對應的元素,造成索引越界
- 空指針異常: 通路的數組已經不再指向堆記憶體的資料,造成空指針異常
- null: 空值,引用資料類型的預設值,表示不再指向任何有效對象