Java基礎語法 目錄1. 概述1.1. 語言特性1.2. 開發平臺1.3. 開發環境1.4. 開發步驟1.5. 註釋2. 變數與運算符2.1. 關鍵字/保留字2.2. 標識符2.3. 變數2.4. 常用數據類型2.4.1. 基本數據類型(8種)2.4.2. 引用數據類型2.4.3. 數據類型轉換2 ...
Java基礎語法
目錄1. 概述
Java是SUN公司於1995年開發的一門高級程式設計語言
1.1. 語言特性
優點
- 跨平臺——核心特點,JVM
- 面向對象
- 健壯性
- 安全性
- 簡單性
- 高性能——即時編譯,JIT
缺點
- 語法複雜、嚴謹
- 架構比較重,適用於大型網站開發
- 並非適用於所有領域
1.2. 開發平臺
- Java SE(J2SE)——桌面級應用
- Java EE(J2EE)——伺服器端應用
- Java ME(J2ME)——移動終端應用
1.3. 開發環境
JDK
:Java程式開發工具包,包含JRE
和開發人員使用的工具JRE
:Java程式運行時環境,包含JVM
和運行時所需的核心類庫
JDK = JRE + 開發工具集
JRE = JVM + Java SE標準類庫
1.4. 開發步驟
-
編碼:編寫Java代碼,並保存到
.java
格式的源文件中 -
編譯:使用javac.exe對源代碼進行編譯,生成一個或多個位元組碼文件
.class
(每個對應一個Java類,文件名與類名相同)javac <src_name>.java
-
執行:使用java.exe運行位元組碼文件
java <class_name>
註意
- 一個源文件可以聲明多個類,但最多有一個使用public關鍵字且該類名必須與源文件名相同
1.5. 註釋
-
單行註釋:
//
及該行中其後的內容// 這是單行註釋
-
多行註釋:
/*
和*/
之間的所有內容/* 這是多行註釋 ... 註釋不參與編譯 */
-
文檔註釋(Java特有):
/**
和*/
之間的所有內容/** 這是文檔註釋 @author vinchell @version 1.0.0 */
說明
-
文檔註釋可被javadoc工具解析,生成網頁文件形式的說明文檔,命令格式為
javadoc -d <out_dir> -version -author <src_name>.java
2. 變數與運算符
2.1. 關鍵字/保留字
Java語言中具有專門用途的字元序列(單詞),全部由
小寫字母
組成
概覽(50個)
abstract | assert | boolean | break | byte |
---|---|---|---|---|
case | catch | char | class | const* |
continue | default | do | double | else |
enum | extends | final | finally | float |
for | goto* | if | implements | import |
instanceof | int | interface | long | native |
new | package | private | protected | public |
return | strictfp | short | static | super |
switch | synchronized | this | throw | throws |
transient | try | void | volatile | while |
2.2. 標識符
Java中變數、方法、類等要素命名時使用的字元序列
命名規則
- 由大小寫英文字母
a-zA-Z
、數字0-9
、下劃線_
、美元符$
組成 - 以字母、下劃線、美元符開頭,不能以數字開頭
- 不能使用關鍵字和保留字,但可以包含關鍵字和保留字
- 嚴格區分大小寫,無長度限制
命名規範
- 包名:所有字母都使用小寫
- 類名、介面名(大駝峰):所有單詞的首字母使用大寫
- 變數名、方法名(小駝峰):除第一個外,所有單詞的首字母使用大寫
- 常量名:所有字母都是用大寫,單詞之間用下劃線連接
2.3. 變數
變數是記憶體中的一個存儲區域,該區域的數據可以在同一類型範圍內不斷變化
- 三要素:數據類型、變數名、存儲的值
說明
- 變數只在其作用域內有效
- 同一作用域內變數不能重名
聲明語法
// 聲明
type varName;
// 聲明和初始化
type varName = value;
2.4. 常用數據類型
2.4.1. 基本數據類型(8種)
-
整形(4種)
類型 長度 表數範圍 byte 1位元組 -128~127 short 2位元組 -32768~32767 int(預設) 4位元組 -231~231-1 (約21億) long 8位元組 -263~263-1 說明
- Java預設的整數類型為
int
- long類型的字面量(值)末尾需加上
l
或L
- Java預設的整數類型為
-
浮點型(2種)
類型 長度 表數範圍 float 4位元組 -3.403×1038~3.403×1038 (小數點後7位) double 8位元組 -1.798×10308~1.798×10308 (小數點後15~16位) 說明
- 浮點型字面量的兩種表示形式:十進位數、科學計數法表示
- Java預設的浮點數類型為
double
- float類型的字面量(值)末尾需加上
f
或F
-
字元型(char,2位元組)
- 字元型字面量的四種表示形式:單引號(
''
)括起來的單個字元、Unicode碼('\uxxxx'
)、轉義字元、ASCII碼
- 字元型字面量的四種表示形式:單引號(
-
布爾型(boolean,4位元組)
- 字面量只有
true
和false
- Java中0和非0數不能轉換為true和false
- 字面量只有
2.4.2. 引用數據類型
類(class)、數組(array)、介面(interface)、枚舉(enum)、註解(annotation)、記錄(record)
常用引用數據類型
-
字元串(String)
字元串是指記憶體中連續分佈的零個或多個字元
說明
- 字元串字面量是由雙引號(
""
)括起來的零個或多個字元 - 字元串與基本數據類型只能進行連接(
+
)運算,結果為字元串
- 字元串字面量是由雙引號(
-
數組(Array)
數組是多個類型相同的數據按照一定順序排列的集合
說明
- 數組的元素可以是任何一種數據類型
- 數組在記憶體中占據連續的存儲空間,且長度確定
- 數組名引用存儲空間的首地址,下標(索引)指定元素的相對地址
2.4.3. 數據類型轉換
隱式轉換
- 規則:表數範圍小的類型轉換為表數範圍大的類型(非存儲空間大小)
- 順序:byte、short、char --> int --> long --> float --> double
- 特例:算術運算中byte、short、char類型自動轉換為int類型(避免溢出)
顯式轉換
-
規則:表數範圍大的類型轉換為表數範圍小的類型(可能造成精度損失)
-
語法
type varName = (type) value;
2.5. 運算符
2.5.1. 算術運算符(7個)
+
、-
、*
、/
、%
、++
、--
說明
%
餘數的符號與被模數相同++
、--
不改變變數的數據類型- 前置
++
、--
先運算再取值;後置++
(--
)先取值再運算
2.5.2. 關係運算符(6個)
>
、>=
、<
、<=
、==
、!=
、instanceof
說明
- 關係運算符的結果都是boolean類型
==
、!=
適用於基本數據類型和引用數據類型
2.5.3. 邏輯運算符(6個)
&
、|
、!
、^
、&&
、||
說明
- 邏輯運算符的操作數都是boolean類型,結果也是boolean類型
&&
、||
為短路運算,即左操作數能確定結果時不運算右操作數
2.5.4. 位運算符(7個)
&
、|
、^
、~
、<<
、>>
、>>>
說明
- 位運算符的運算過程基於補碼進行
- 無符號右移運算符
>>>
移位後左側的空位補0(無論正負)
2.5.5. 賦值運算符(12個)
=
、+=
、-=
、*=
、/=
、%=
、&=
、|=
、^=
、>>=
、<<=
、>>>=
說明
=
兩側數據類型不一致時,需要隱式或顯示類型轉換+=
、-=
、*=
、/=
、%=
不改變變數的數據類型
2.5.6. 條件運算符(1個)
?:
語法
condExpr?trueExpr:falseExpr
說明
- 如果運算後賦值給變數,則trueExpr和falseExpr的類型應相同或能自動轉換
- 條件表達式可以改為if-else結構;反之,不成立
- 條件表達式的執行效率略高於if-else結構
2.5.7. 優先順序
優先順序 | 運算符 | 結合性 |
---|---|---|
1 | () 、[] 、. |
從左到右 |
2 | ++ 、-- 、~ 、! 、+(正) 、-(負) |
從右到左 |
3 | * 、/ 、% |
從左到右 |
4 | +(加) 、-(減) |
從左到右 |
5 | << 、>> 、>>> |
從左到右 |
6 | < 、<= 、>= 、> 、instanceof |
從左到右 |
7 | == 、!= |
從左到右 |
8 | & |
從左到右 |
9 | ^ |
從左到右 |
10 | ` | ` |
11 | && |
從左到右 |
12 | ` | |
13 | ?: |
從右到左 |
14 | = 、+= 、-= 、*= 、/= 、%= 、&= 、` |
=、 <<=、 >>=、 >>>=` |
3. 流程式控制制
流程式控制制就是用來控製程序中各語句的執行順序,從而將其組合成能完成一定功能的邏輯模塊
- 三種流程結構:順序結構、分支結構、迴圈結構
3.1. 順序結構
程式從上到下逐行執行,沒有任何判斷和跳轉
3.2. 分支結構
程式根據條件選擇性地執行某段代碼
3.2.1. if-else
單分支結構
-
語法格式
if (condExpr) { statements }
-
執行流程
計算條件表達式condExpr:值為true,則執行語句statements;否則,不執行
-
流程圖
雙分支結構
-
語法格式
if (condExpr) { statements1 } else { statements2 }
-
執行流程
計算條件表達式condExpr:值為true,則執行語句statements1;否則,執行語句statements2
-
流程圖
多分支結構
-
語法格式
if (condExpr1) { statements1 } else if (condExpr2) { statements2 } ... else { statementsN+1 }
-
執行流程
- 計算條件表達式condExpr1:值為true,則執行語句statements1;否則,執行下一步
- 計算條件表達式condExpr2:值為true,則執行語句statements2;否則,執行下一步
- ……
- 計算條件表達式condExprN:值為true,則執行語句statementsN;否則,執行下一步
- 執行語句statementsN+1
-
流程圖
-
說明
- 多分支結構中,
else
分支可以有0個或1個,else if
分支可以有任意個
- 多分支結構中,
3.2.2. switch-case結構
-
語法結構
switch (expr) { case const1: statements1; case const2: statements2; ... default: statementsN+1; }
-
執行流程
- 根據表達式expr的值,依次匹配各個case後的常量
- 如果表達式的值等於constM,則從語句statementsM向下執行,直到遇到break或結構結束
-
流程圖
-
說明
- 表達式expr只能是byte、short、char、int、String或枚舉類型
- case分支必須是常量且互不相同,不能是變數、表達式
- default分支可以有0個或1個,case分支可以有任意個
- default分支可以在任意位置
3.2.3. 分支嵌套
分支嵌套是指一個分支結構的某個(些)分支中包含另一個(些)分支結構
3.3. 迴圈結構
程式根據迴圈條件重覆性地執行某段代碼
- 迴圈四要素:迴圈初始化、迴圈條件、迴圈體、迴圈控制
3.3.1. for迴圈
-
語法結構
for (loopInit; loopCond; loopCtrl) { loopBody }
-
執行流程
- 執行迴圈初始化
- 判斷迴圈條件是否滿足:滿足則執行下一步;否則,跳出迴圈
- 執行迴圈體
- 執行迴圈控制語句,並跳回步驟2
-
流程圖
-
說明
- loopInit可以初始化多個變數,中間適用
,
分隔 - loopCtrl可以更新多個變數,中間使用
,
分隔
- loopInit可以初始化多個變數,中間適用
3.3.2. while迴圈
-
語法結構
loopInit while (loopCond) { loopBody loopCtrl }
-
執行流程
- 執行迴圈初始化
- 判斷迴圈條件是否滿足:滿足則執行下一步;否則,跳出迴圈
- 執行迴圈體和迴圈控制,並跳回步驟2
-
流程圖
3.3.3. do-while迴圈
-
語法結構
loopInit do { loopBody loopCtrl } while (loopCond);
-
執行流程
- 執行迴圈初始化
- 執行迴圈體和迴圈控制
- 判斷迴圈條件是否滿足:滿足則跳回步驟2;否則,跳出迴圈
-
流程圖
3.3.4. 迴圈嵌套
迴圈嵌套是指一個迴圈結構A的迴圈體中包含另一個迴圈結構B,習慣上將迴圈結構A稱為外層迴圈,迴圈結構B稱為內層迴圈
3.4. 關鍵字break
和continue
3.4.1. break
結束當前迴圈或switch
結構,即跳出迴圈或switch
結構
語法格式
// 無標簽:結束最近的迴圈或switch結構
break;
// 有標簽:結束標簽指定的迴圈或switch結構
break label;
3.4.2. continue
結束本次迴圈,開始下一次迴圈
語法格式
// 無標簽:結束最近迴圈結構的本次迴圈,開始下一次迴圈
continue;
// 有標簽:結束標簽指定迴圈結構的本次迴圈,開始下一次迴圈
continue label;
4. 數組
數組是多個類型相同的數據按照一定順序排列的集合
說明
- 數組的元素可以是任何一種數據類型
- 數組在記憶體中占據連續的存儲空間且長度不可更改
- 數組占用空間的大小取決於其長度和元素類型
- 數組中的元素在記憶體中是依次緊密排列的,即有序的
- 數組名引用存儲空間的首地址,下標(索引)指定元素的相對地址
4.1. 一維數組
4.1.1. 聲明和初始化
// 靜態初始化
type[] arrName = new type[]{value0, value1...}; // 推薦
type arrName[] = new type[]{value0, value1...};
type[] arrName = {value0, value1...}; // 類型推斷
// 動態初始化
type[] arrName = new type[nElem]; // 推薦
type arrName[] = new type[nElem];
說明
- 數組變數和數組元素的初始化操作同時進行,稱為靜態初始化;數組變數和數組元素的初始化操作分開進行,則稱為動態初始化
- 靜態初始化的數組長度由靜態數組的個數決定;動態初始化則需要指定數組元素的個數
4.1.2. 元素訪問
arrName[index]
說明
- 數組的長度為
arrName.length
- 數組元素的下標範圍為
0~length-1
4.2. 二維數組
4.2.1. 聲明和初始化
// 靜態初始化
type[][] arrName = new type[][]{{value0, value1...}, {value0, value1...}...}; // 推薦
type arrName[][] = new type[][]{{value0, value1...}, {value0, value1...}...};
type[] arrName[] = new type[][]{{value0, value1...}, {value0, value1...}...};
type[][] arrName = {{value0, value1...}, {value0, value1...}...}; // 類型推斷
// 動態初始化
type[][] arrName = new type[nElem1][nElem2]; // 推薦
type arrName[][] = new type[nElem1][nElem2];
type[] arrName[] = new type[nElem1][nElem2];
type[][] arrName = new type[nElem1][]; // 預設最後一維
4.2.2. 元素訪問
// 訪問外層元素
arrName[index1]
// 訪問內層元素
arrName[index1][index2]
4.3. 預設值
元素類型 | 初始值 |
---|---|
byte、short、int | 0 |
long | 0l |
float | 0.0f |
double | 0.0 |
char | 0或'\u0000' |
boolean | false |
引用類型 | null |
4.4. 說明
- 高維數組本質上是低維數組的嵌套,即高維數組的元素是低維數組的引用
- 各維度數組元素的長度可以相同,也可以不同
- 當前維度數組的長度為
arrName.length
,其數組元素的長度為arrName[index].length
- 維度不同、元素類型的數組視為不同的引用類型,不能相互轉換
5. 常用API
5.1. 輸入輸出
5.1.1. 輸入
-
導包
java.util.Scanner
import java.util.Scanner;
-
實例化
Scanner
類Scanner scanner = new Scanner(System.in);
-
調用
nextXxx
方法xxx input = scanner.nextXxx();
-
關閉資源
scanner.close();
5.1.2. 輸出
// 控制台輸出並換行
System.out.println(output);
// 控制台輸出不換行
System.out.print(output);
5.2. 常用類
5.2.1. java.lang.Math
類別 | 方法 | 說明 |
---|---|---|
數學函數 | static double sqrt(double a) | 返回a的平方根 |
隨機數 | static double random() | 返回[0.0, 1.0)範圍內的隨機數 |
5.2.2. java.lang.System
類別 | 方法 | 說明 |
---|---|---|
時間日期 | static long currentTimeMillis() | 返回當前時間戳 |
5.2.3. java.util.Arrays
類別 | 方法 | 說明 |
---|---|---|
拼接 | static String toString(type[] a) | 返回由數組元素組成的字元串(用[] 括起,元素間由, + 分隔) |
排序 | static void sort(type[] a) | 將數組a的元素按照升序排序 |
排序 | static void sort(type[] a, int fromIndex, int toIndex) | 將數組a指定範圍[fromIndex, toIndex)內的元素按照升序排序 |
查找 | static int binarySearch(type[] a, type key) | 返回key在有序數組a中的第一次出現的下標,不存在則返回負數 |
查找 | static int binarySearch(type[] a, int fromIndex, int toIndex, type key) | 返回key在有序數組a指定範圍[fromIndex, toIndex)內的第一次出現的下標,不存在則返回負數 |
複製 | static type[] copyOf(type[] original, int newLength) | 複製數組original到長度為newLength的新數組中並返回 |
複製 | static type[] copyOfRange(type[] original, int from, int to) | 複製數組original指定範圍[from, to)內的元素到長度為newLength的新數組中並返回 |
比較 | static boolean equals(type[] a, type[] b) | 比較數組a、b的元素是否相同 |
比較 | static boolean equals(type[] a, int aFromIndex, int aToIndex, type[] b, int bFromIndex, int bToIndex) | 比較數組a、b指定範圍[aFromIndex, aToIndex)、[bFromIndex, bToIndex)內的元素是否相同 |
填充 | static void fill(type[] a, type val) | 用val填充數組a |
填充 | static void fill(type[] a, int fromIndex, int toIndex, type val) | 用val填充數組a的指定範圍[fromIndex, toIndex) |
6. 擴展
6.1. Java虛擬機的記憶體劃分
區功能變數名稱稱 | 作用 |
---|---|
虛擬機棧 | 存儲正在執行方法的局部變數表(基本數據類型、對象引用)等 |
堆 | 存儲對象 |
方法區 | 存儲已被JVM載入的類信息、常量、靜態變數、即時編譯器編譯後的代碼等 |
本地方法棧 | 本地(native)方法執行期間的記憶體區域 |
程式計數器 | 存放每一個線程下一條要執行指令的地址 |