java(上)
模塊一
1.JDK,JRE,JVM
知識點 | 核心內容 | 易混淆點 |
JDK定義 | Java Development Kit(Java開發工具包),包含開發所需全部工具 | JDK包含JRE的關系容易混淆 |
JRE定義 | Java Runtime Environment(Java運行環境),包含JVM和核心類庫 | JRE與JDK的包含關系 |
JVM作用 | Java虛擬機,實現跨平臺運行的核心組件 | JVM在JRE中的位置 |
開發工具 | 包含javac(編譯)、java(運行)、jdb(調試)、jhat(內存分析)等工具 | 各工具的具體用途區分 |
版本變化 | JDK 9開始取消獨立JRE目錄,采用模塊化技術優化運行時環境 | 新舊版本目錄結構差異 |
模塊化優勢 | 允許創建最小運行時環境,提高運行效率,減少資源占用 | 與傳統JRE部署方式的對比 |
安裝建議 | 只需安裝JDK即可獲得完整開發環境(包含JRE和JVM) | JDK版本選擇注意事項 |
2.API文檔注釋
知識點 | 核心內容 | 重點 |
文檔注釋的作用 | 通過Javadoc生成API文檔,幫助他人快速理解代碼功能、類用途及方法說明 | 需區分普通注釋與文檔注釋的語法差異(/?**? */ vs //或/* */) |
Javadoc命令語法 | javadoc -d [文件夾名] -author -version [文件名.java] | 參數順序易錯(如-d必須在前),忽略警告可能影響文檔完整性 |
API文檔結構 | 包含類描述、作者、版本、方法功能說明(如main為程序入口) | 方法注釋需標注參數(@param),否則生成警告 |
文檔注釋內容規范 | 類注釋需說明整體功能,方法注釋需明確用途(如main是虛擬機執行入口) | 注解(@author、@version)需與注釋內容分離 |
3.print與println區別
知識點 | 核心內容 | 重點 |
print與println的區別 | print和println都是輸出語句 | 區分print和println的輸出效果 |
println輸出后自帶換行效果 | println輸出后會自動換到下一行 | |
print輸出后不帶換行效果 | print輸出后會繼續在同一行顯示后續內容 | |
JAVA操作小技巧 | 復制當前行:ctrl+d | 快捷鍵使用,提高編碼效率 |
一次操作多行:預留空間,按住ALT鍵不放,鼠標往下拉 | 適用于需要同時編輯多行代碼的情況 |
模塊二
4.常量
知識點 | 核心內容 | 重點 |
常量定義 | 在代碼運行過程中,其值不會發生改變的數據 | 區分常量與變量的關鍵:值是否可變 |
整數常量 | 包含所有正負整數(如 -1, 0, 100) | 無特殊易錯點 |
小數常量 | 帶小數點的數值(如 2.5, 2.0) | 易混淆點:2.0 是小數常量而非整數 |
字符常量 | 單引號包裹的單個內容(如 'A', ' ', '\t') | 必須且只能有一個字符: - '11' 無效(兩個字符); - ' ' 有效(空格算一個字符) |
字符串常量 | 雙引號包裹的任意內容(如 "Hello", "") | 空字符串 "" 是有效數據,與 null 不同 |
布爾常量 | 僅 true/false(不加引號) | 易錯點:"true" 是字符串而非布爾值 |
空常量(null) | 表示數據不存在(如 null) | 與空字符串區別: - null:數據不存在; - "":數據存在但內容為空 |
5.常量使用
知識點 | 核心內容 | 重點 |
常量使用 | 常量定義與分類 | 常量在程序中的不變性 |
整數常量 | 輸出整數常量示例(-1) | 整數常量的正負性 |
小數常量 | 輸出小數常量示例(1.5,1.0) | 小數點后即使為零也算小數常量 |
字符常量 | 單引號中必須有且只能有一個內容 | 單引號中多個字符會報錯 |
- 空格作為字符常量 | 空格也算一個字符內容 | 與多個空格區分(不算字符常量) |
- Tab鍵作為字符常量 | Tab鍵算一個字符內容 | 與四個空格的區分 |
字符串常量 | 雙引號中可以包含任意字符 | 空字符串也是合法的 |
布爾常量 | true和false為布爾常量 | 布爾常量與字符串的區別 |
空常量 | 空常量代表數據不存在 | 空常量不能直接輸出使用 |
6.變量定義與使用
知識點 | 核心內容 | 重點 |
byte類型 | byte num1 = 100; 取值范圍限制(-128~127) | 超出范圍會編譯報錯,如byte num1 = 1000; |
short類型 | short num2 = 1000; 可重新賦值num2 = 1001; | 變量值可動態修改,體現"變量"特性 |
int類型 | int num3 = 10000; 默認整數類型(±21億范圍) | 直接輸出變量名即可顯示存儲的值 |
long類型 | long num4 = 10L; 需加后綴L/l | 必須加L/l后綴,涉及數據類型轉換原理 |
float類型 | float num5 = 2.5f; 需加后綴F/f | 必須加F/f后綴,與double區別 |
double類型 | double num6 = 2.5; 默認小數類型 | 無需后綴,直接賦值小數 |
char類型 | char num7 = 'a'; 單引號單字符 | 必須單引號且只能一個字符 |
boolean類型 | boolean num8 = true; 可重新賦值num8 = num9; | 變量值傳遞機制(引用關系) |
String類型 | String name = "金蓮"; 雙引號字符串 | 屬于引用類型但定義格式類似基本類型 |
7.轉義字符
知識點 | 核心內容 | 重點 |
轉義字符定義 | 反斜杠在定義變量時代表轉義字符,可轉換字符含義 | 區分普通字符與轉義字符的語法差異 |
轉義字符功能 | 1. 將普通字符轉為特殊含義字符; 2. 將特殊字符轉為普通字符 | 反斜杠n與println的換行效果對比 |
常見轉義符示例 | - \n換行符; - \t制表符(Tab鍵效果) | 記憶\n與\t的具體應用場景 |
路徑表示問題 | 單反斜杠引發非法轉義符錯誤,需用\\表示真實反斜杠 | 雙反斜杠的轉義原理理解 |
8.標識符
知識點 | 核心內容 | 重點 |
標識符定義 | 給類、方法、變量取的名字 | 區分標識符與關鍵字 |
硬性規定 | 1. 可包含:英文字母、數字、$、_; 2. 不能以數字開頭; 3. 不能是關鍵字(如static、public) | 數字開頭的錯誤示例:int 1I |
軟性建議 | 1. 類名:大駝峰式(每個單詞首字母大寫); 2. 方法/變量名:小駝峰式(首單詞小寫,后續單詞首字母大寫); 3. 見名知意,禁用中文 | 類名示例:Demo08; 變量名示例:publicStatic |
關鍵字沖突 | 避免使用Java預定義關鍵字(如static、public) | 組合非關鍵字可用(如publicStatic) |
9.強轉注意事項
知識點 | 核心內容 | 重點 |
byte/short類型自動轉換 | 當使用整數常量賦值且不超出范圍時,JVM會自動強轉 | 常量賦值無需手動強轉 vs 變量參與需手動強轉 |
類型提升規則 | byte/short運算時自動提升為int型 | b=b+1會報錯需強制轉換 |
char類型運算特性 | 參與運算時自動提升為int型 | 會查詢ASCII/Unicode碼表轉換 |
ASCII碼表應用 | 英文字符對應整數值查詢表 | 字符'0'=48/'A'=65/'a'=97的規律 |
Unicode碼表擴展 | 處理ASCII范圍外的字符(如中文) | 漢字"中"=20013的編碼原理 |
強制轉換語法 | (byte)(b+1)的括號使用技巧 | 整體表達式轉換 vs 局部變量轉換 |
模塊三
10.idea常用快捷鍵
知識點 | 核心內容 | 重點 |
常用快捷鍵 | Alt+回車:導入包及自動修正代碼 | 快捷鍵的使用和自動修正功能 |
自動修正代碼示例 | int I = 2.5報錯,Alt+回車選擇cast to int修復 | 強制類型轉換的自動修復 |
變量重名問題 | 在同一作用域內不能定義重名變量 | 變量命名規則和錯誤處理 |
無變量接收值問題 | 直接寫100會報錯,Alt+回車自動生成變量接收 | 變量定義和錯誤處理 |
導包操作 | 使用Scanner類需要導包,Alt+回車自動導包 | 類的導入和包管理 |
刪除行快捷鍵 | Ctrl+Y:刪除光標所在行 | 快捷鍵的使用和代碼編輯效率 |
復制當前行 | Ctrl+D:復制當前行代碼 | 快捷鍵的使用和代碼編輯效率 |
格式化代碼 | Ctrl+Alt+L:格式化代碼 | 代碼格式化和可讀性提升 |
單行注釋 | Ctrl+/:單行注釋 | 注釋的使用和代碼管理 |
多行注釋 | Ctrl+Shift+/:多行注釋 | 注釋的使用和代碼管理 |
移動當前行 | Alt+Shift+上下箭頭:移動當前行代碼 | 代碼編輯和重構效率 |
自動生成變量 | 先寫等號右邊,Alt+回車選擇introduce local variable生成左邊變量 | 變量定義和代碼自動化 |
11.賦值運算符
知識點 | 核心內容 | 重點 |
基本賦值運算符 | 使用等號(=)進行賦值操作,先計算右邊表達式再將結果賦給左邊變量 | 必須區分賦值方向(右→左)與數學等號的區別 |
復合賦值運算符 | 包含+=、-=、*=、/=、%=等組合運算符 | b += 1與b = b + 1不等價(前者自動類型轉換) |
類型轉換規則 | 變量參與運算時自動提升為int型,常量賦值不超范圍則無需轉換 | byte/short運算必須手動強轉,復合運算符例外 |
復合運算符特性 | 虛擬機對+=等操作自動處理類型轉換,無需顯式強轉 | 實際開發中優先使用復合運算符簡化代碼 |
12.與或運算符
知識點 | 核心內容 | 易混淆點 | 代碼驗證示例 |
單與(&)運算符 | 1. 布爾型運算:有假則假; 2. 數字型運算:按位與; 3. 無短路效果(前為假仍執行后面判斷) | 與雙與的短路效果區別 | int a=10,b=20; boolean r=(++a>100) & (++b>10);; 結果:a=11,b=21 |
雙與(&&)運算符 | 1. 布爾型運算:有假則假; 2. 有短路效果(前為假則跳過后面判斷) | 不能用于數字位運算 | int a=10,b=20; boolean r=(++a>100) && (++b>10);; 結果:a=11,b=20 |
單或(|)運算符 | 1. 布爾型運算:有真則真; 2. 數字型運算:按位或; 3. 無短路效果(前為真仍執行后面判斷) | 與雙或的短路效果區別 | int a=10,b=20; boolean r=(++a<100) | (++b>10);; 結果:a=11,b=21 |
雙或(||)運算符 | 1. 布爾型運算:有真則真; 2. 有短路效果(前為真則跳過后面判斷) | 不能用于數字位運算 | int a=10,b=20; boolean r=(++a<100) || (++b>10);; 結果:a=11,b=20 |
數值區間判斷 | 正確寫法:i>=1 && i<=100; 錯誤寫法:1<=i<=100(數學表達式不適用) | Java語法與數學表達式的區別 | int i=50; boolean inRange=(i>=1 && i<=100); |
模塊四
13.Scanner類的next()方法和nextLine()方法
知識點 | 核心內容 | 重點 |
Scanner類的next()方法 | 用于錄入字符串,遇到空格或回車即結束錄入 | 空格會截斷輸入,只接收空格前的部分 |
Scanner類的nextLine()方法 | 用于錄入字符串,僅遇到回車才結束錄入 | 可接收包含空格的完整字符串 |
next()與nextLine()混合使用問題 | 連續使用時nextLine()會接收next()遺留的空格及后續內容 | 看似跳過輸入,實際是接收了殘留數據 |
數據類型匹配異常 | nextInt()等類型方法要求輸入匹配的數據類型 | 輸入非整數字符會拋出InputMismatchException |
14.Random隨機數
知識點 | 核心內容 | 重點 |
Random類的基本使用 | 導包→創建對象→調用方法(nextInt()) | 默認范圍:int全范圍隨機;指定范圍:nextInt(n)生成0到n-1的隨機數 |
指定范圍的隨機數生成 | 通過數學運算調整范圍(如nextInt(10)+1生成1-10) | 易錯點:范圍邊界計算(如100-999需nextInt(900)+100) |
Random的底層機制 | 每次運行重新生成隨機數,結果不可預測 | 對比:與固定種子(new Random(seed))的確定性差異 |
常見應用場景 | 抽獎、驗證碼、游戲數值等需隨機結果的場景 | 注意:范圍邏輯需嚴格驗證(如1-100≠nextInt(100)) |
15.switch case
知識點 | 核心內容 | 重點 |
switch語句的break作用 | break用于結束當前case語句,防止執行后續case | 忘記寫break會導致case穿透 |
case穿透現象 | 當case后沒有break時,程序會繼續執行后續case直到遇到break或switch結束 | 穿透會執行多個case代碼塊 |
穿透性應用場景 | 利用穿透特性簡化多條件同結果代碼(如12/1/2月都輸出冬季) | 需明確何時需要/不需要break |
月份季節判斷案例 | 通過穿透性優化代碼結構: - 冬季(12/1/2月); - 春季(3/4/5月); - 夏季(6/7/8月); - 秋季(9/10/11月) | default處理非法輸入 |
Scanner輸入應用 | 配合switch實現動態輸入驗證: Scanner.nextInt()獲取用戶輸入 | 輸入類型需與case匹配 |
16.if與switch的區別
知識點 | 核心內容 | 重點 |
if與switch的區別 | if從上到下逐個條件判斷;switch直接跳轉匹配的case | 執行流程差異(if順序判斷 vs switch精準跳轉) |
if的靈活性 | 支持復雜條件邏輯(如范圍判斷、組合條件) | 實際開發中if使用更頻繁 |
switch的效率特性 | 基于單一值快速匹配,適合離散值枚舉 | break的作用(防止case穿透) |
debug工具應用 | 通過調試觀察代碼執行流程 | 斷點調試演示if/switch差異 |
17.do-while循環
知識點 | 核心內容 | 重點 |
do-while循環 | 先執行循環體再判斷條件,至少循環一次 | 與while/for循環的區別:執行順序差異(先循環后判斷) |
語法結構 | do {循環語句; 步進表達式;} while(比較條件); | 大括號位置、分號結尾易遺漏 |
執行流程 | 1. 初始化變量→2. 執行循環體→3. 步進表達式→4. 條件判斷→重復2-4直到false | 強制首輪執行的特性 |
適用場景 | 需至少執行一次的場景(如輸入校驗、菜單交互) | 開發中使用頻率較低 |
模塊五
18.數組
知識點 | 核心內容 | 重點 |
數組長度獲取 | 使用數組名.length語法(不帶括號) | length是屬性不是方法,區別于nextInt()等帶括號的方法調用 |
數組索引概念 | 元素在數組中的存儲位置/編號(從0開始) | 最大索引=數組長度-1,索引具有唯一性 |
數組操作原理 | 所有存取查操作都需通過索引完成 | 類比旅店房間號機制(零基編號系統) |
字符串數組示例 | String[] arr = {"迪迦奧特曼","貓和老鼠","海綿寶寶"} | 靜態初始化語法與索引對應關系(0=迪迦) |
長度屬性驗證 | int len = arr.length;輸出元素數量 | 屬性與方法語法差異(無參vs帶括號) |
19.數組獲取數據
知識點 | 核心內容 | 重點 |
數組元素獲取方法 | 通過索引值獲取元素(數組名[索引]),直接輸出數組名會返回內存地址值 | 地址值 vs 元素值; 直接輸出數組名返回的是地址值而非元素內容 |
數組內存機制 | 數組在內存中分配地址值(唯一標識),通過地址值可定位并操作數組 | 地址值的本質; 內存中的"身份證號",用于唯一標識數組 |
默認值規則 | 未賦值的數組元素存在默認值: - 整數:0; - 小數:0.0; - 字符:\u0000; - 布爾:false; - 引用類型:null | 動態初始化未賦值的陷阱; 系統自動賦予默認值而非"空" |
存取操作規范 | 存值需賦值(arr[0]=1),取值直接引用索引(System.out.println(arr[0])) | 操作符混淆風險; 存取語法相似但等號是關鍵區分點 |
20.數組擴容
知識點 | 核心內容 | 重點 |
數組擴容原理 | 通過創建新數組并復制原數組元素實現擴容,原數組引用指向新數組地址 | 數組定長特性 vs 擴容邏輯(地址值覆蓋) |
內存地址機制 | 數組變量存儲的是內存地址值,通過賦值操作可改變引用指向 | 地址值傳遞與原始數組的關系 |
代碼實現步驟 | 1. 創建新數組; 2. 復制元素; 3. 地址值覆蓋(oldArr = newArr) | 元素復制范圍控制(避免越界) |
默認值規則 | 擴容后新增位置自動填充默認值(如int數組為0) | 未顯式賦值的元素狀態 |
21.內存劃分
知識點 | 核心內容 | 重點 |
內存劃分 | JAVA將內存劃分為五部分:棧(Stack)、堆(Heap)、方法區(Method Area)、本地方法棧(Native Method Stack)、寄存器(PC Register) | 重點掌握前三部分(棧、堆、方法區) |
棧內存(Stack) | 存儲方法運行時的數據(如局部變量),方法執行時入棧,執行完畢彈棧釋放內存 | 方法未及時彈棧會導致棧內存溢出 |
堆內存(Heap) | 存儲對象和數組,new操作在堆中開辟空間并分配地址值,數據有默認值(如int=0、boolean=false) | 地址值的作用(通過變量引用堆中對象) |
方法區(Method Area) | 代碼預備區,存儲類信息和方法信息(如.class文件內容) | 與棧/堆的協作關系(代碼加載→方法區→運行時分配) |
本地方法棧 | 運行Native方法(如C語言編寫的底層功能,擴展JAVA能力) | 與硬件交互的場景(如IO流讀寫硬盤) |
內存協作流程 | 示例: int[] arr = new int[3]; 1. .class加載到方法區; 2. main方法入棧運行; 3. new在堆中開辟數組空間(含默認值); 4. 變量arr保存堆內存地址 | 地址指向的實際意義(變量通過地址操作堆內對象) |
22.二維數組
知識點 | 核心內容 | 重點 |
二維數組定義 | 使用兩個中括號表示二維數組,本質是"數組套數組" | 動態初始化與靜態初始化的語法區別 |
動態初始化語法 | 數據類型[][] 數組名 = new 數據類型[m][n]; 三種變體:中括號前置/后置/分開放置 | m代表二維數組長度(包含的一維數組數量); n代表每個一維數組的長度 |
特殊動態初始化 | new 數據類型[m][]形式表示一維數組未被創建; 未創建的一維數組默認值為null | 與帶n聲明的區別:后者已創建但元素為默認值 |
靜態初始化 | 直接賦值:數據類型[][] 數組名 = {{元素1,元素2},{...}}; 支持簡化寫法省略new關鍵字 | 各一維數組長度可不一致; 與動態初始化固定長度的區別 |
內存結構示例 | 圖示說明new int[2][3]和new int[2][]的內存分配差異 | null與默認值的內存狀態區別 |
典型應用場景 | 不規則二維數組案例: {{"孫悟空","唐僧"},{"劉備","關羽","張飛"}} | 靜態初始化更適合非對稱數據結構 |
模塊六
23.方法定義
知識點 | 核心內容 | 重點 |
方法定義通用格式 | 修飾符 + 返回值類型 + 方法名 + 參數 + 方法體 + return結果 | void與return的沖突(void方法不可return具體值) |
修飾符作用 | public static固定搭配(公共訪問權限 + 靜態方法) | 面向對象階段會詳細解釋 |
返回值類型 | 由return結果的數據類型決定(如int/double/String) | 無返回值時需用void |
方法命名規范 | 小駝峰命名法(如getSum) | 需見名知意 |
參數定義 | 數據類型 + 變量名(多個參數用逗號隔開) | 調用時賦值,定義時不需初始化 |
方法體與return | 方法體為具體實現代碼;return返回結果(僅非void方法可用) | 方法體操作參數生成返回值(類比“牛消化飼料產奶”) |
IDE分割線設置 | 勾選Show Method顯示方法間分割線(解決代碼混淆問題) | 路徑:File → Settings → Editor → General → Appearance |
24.無參有返回值方法
知識點 | 核心內容 | 重點 |
無參有返回值方法的定義 | public static+返回值類型+方法名() {} | 返回值類型不能寫void,方法體需包含return語句 |
返回值的處理 | 方法體內通過return語句返回結果 | 返回值類型需與方法體內返回的數據類型一致 |
方法調用的兩種方式 | 直接調用和賦值調用 | 直接調用將結果直接輸出,賦值調用將結果賦值給變量 |
打印調用(直接調用) | 調用方法后,將結果直接放入輸出語句中 | 適用于不需要再次使用結果的情況 |
賦值調用 | 調用方法后,將結果賦值給一個變量 | 推薦方式,便于后續使用結果 |
執行流程 | 調用方法 -> 執行方法體 -> 返回結果 -> 接收結果 | 理解方法調用的整個過程,特別是返回值的接收 |
示例:整數相加方法 | public static int sum(int a, int b) { return a+b; } | 方法的定義、調用和返回值處理 |
25.方法_參數和返回值使用時機
知識點 | 核心內容 | 重點 |
參數的使用時機 | 當想將方法A的數據傳遞到方法B時,定義方法B需要帶參數 | 參數傳遞的機制和目的 |
返回值的使用時機 | 調用方法A時,想要方法A的結果去參與其他的操作,方法A需要返回結果 | 返回值類型與接收 |
三層架構思想 | Controller層(接收請求回響應)、Service層(業務邏輯)、DAO層(持久層) | 各層職責與協作方式 |
參數在三層架構中的應用 | Ctrl層接收請求參數,通過參數傳遞到Service層,Service層再通過參數傳遞到DAO層 | 參數在各層之間的傳遞與接收 |
返回值在三層架構中的應用 | DAO層查詢結果需要返回給Service層,Service層處理結果需要返回給Ctrl層 | 返回值的傳遞與接收,以及根據返回值做不同的響應 |
三層架構的框架對應 | Ctrl層對應Spring MVC,Service層對應Spring,DAO層對應MyBatis | SSM框架的組成與對應層次 |
26.方法注意事項
知識點 | 核心內容 | 重點 |
方法注意事項 | 方法不調用不執行;執行順序僅與調用順序相關;方法間不可嵌套 | void與return的共存規則 |
void與return的關系 | void表示無返回值,不可與return 結果共存,但可與return(無數據)共存 | return 結果會先返回數據再結束方法;return僅結束方法 |
方法中的return限制 | 一個方法不能連續寫多個return(語法錯誤);if-else分支中的return需覆蓋所有邏輯路徑 | 多返回值需用數組封裝;未覆蓋分支的return會報錯 |
方法調用前提 | 調用方法前需確認方法已定義,否則報錯 | 常見錯誤:未定義直接調用 |
27.方法調用技巧
知識點 | 核心內容 | 重點 |
方法定義與調用 | 先定義后調用,避免報錯 | 定義順序錯誤導致報錯 |
返回值處理 | 無返回值方法在方法內輸出;有返回值方法需用變量接收后輸出 | 返回值類型與接收變量不匹配 |
方法調用方式 | 直接調用(無返回值)、打印調用(不推薦)、賦值調用(推薦) | 混淆調用方式適用場景 |
28.方法重載
知識點 | 核心內容 | 重點 |
方法重載的判斷標準 | 方法名相同且參數列表不同(類型/順序/數量) | 與返回值類型、參數名稱無關 |
重載方法調用沖突 | 當參數類型存在隱式轉換時可能導致調用歧義(如int和double) | sum(10, 2.5)可能同時匹配多個重載 |
典型重載場景 | 相同功能不同實現細節(如集合的add()方法) | 位置添加 vs 末尾添加屬于合法重載 |
非法重載示例 | 僅修改參數名(int a vs int x)或返回值類型 | 編譯器報錯:"method is already defined" |
合法重載變體 | 無參/有參、類型順序不同((int,double) vs (double,int)) | 方法簽名實質不同即可 |
方法簽名唯一性 | 嚴格區分大小寫(Open()與open()不算重載) | 視為完全獨立的方法 |
模塊七
29.面向對象思想
知識點 | 核心內容 | 重點 |
面向對象思想 | 核心編程思想,強調“調用他人功能”而非親力親為(如洗衣機洗衣服、外賣點餐等類比) | 與面向過程的區別(C語言 vs Java); 關鍵判斷標準:是否調用其他類的成員 |
類與對象 | 類(Class)是模板,對象是實例(如Scanner/Random的new操作) | new對象后通過.調用方法; 特殊場景:靜態方法(static)可直接類名調用(如Arrays.toString()) |
匿名對象 | 一次性使用的對象(未賦變量名) | 內存效率 vs 代碼可讀性權衡 |
對象內存解析 | 堆棧內存分配機制(對象在堆,引用在棧) | 易混淆點:基本類型 vs 引用類型的存儲差異 |
成員變量與局部變量 | 作用域與生命周期對比(類內全局 vs 方法內臨時) | 默認值差異:成員變量自動初始化,局部變量需手動賦值 |
面向對象應用場景 | 調用他人功能時使用(如Scanner.nextInt()、Random.nextInt()) | 典型誤區:自身類內方法調用不屬面向對象 |
代碼簡化案例 | Arrays.toString(arr) vs 手動遍歷拼接字符串 | 效率對比:面向對象減少重復代碼量 |
30.對象的使用
知識點 | 核心內容 | 重點 |
類與對象概念 | 類是一類事物的抽象表示形式,對象是類的具體實例 | 抽象vs具體體現的辯證關系 |
對象創建三步法 | 1. 導包 2. 創建對象 3. 調用成員 | 同包下免導包規則與java.lang包特殊性 |
對象成員調用 | 對象名.成員變量 / 對象名.方法() | 方法調用的四種組合形式(有參無參/有返回值無返回值) |
默認值機制 | 未賦值的成員變量自動初始化(如String=null, int=0) | 默認值陷阱在業務邏輯中的影響 |
面向對象基礎語法 | 類名 對象名 = new 類名()標準創建格式 | 對象名命名規范與內存指向原理 |
包訪問規則 | 同包類直接互訪 vs 跨包需導包 | import語句的精確導入與通配符導入區別 |
31.匿名對象
知識點 | 核心內容 | 重點 |
匿名對象的使用 | 匿名對象即沒有變量名直接使用的對象,通過new關鍵字直接創建并調用方法或訪問成員變量 | 匿名對象適用于一次性調用方法,不適用于需要多次訪問或修改對象狀態的場景 |
原始方式與匿名對象的對比 | 原始方式:使用變量接收對象,可以多次訪問和修改對象狀態;匿名對象方式:直接創建并使用對象,無法后續訪問或修改 | 易混淆點:匿名對象無法保存狀態,每次使用都會創建新的對象實例 |
匿名對象的適用場景 | 適用于只需要調用對象方法,不需要保存對象狀態的場景,如調用工具類的方法 | 誤用匿名對象進行賦值操作,會導致無法后續訪問或修改該值 |
原始方式的優勢 | 可以保存對象狀態,方便后續訪問和修改,適用于需要多次使用對象的場景 | |
堆棧內存分析 | 原始方式中,對象存儲在堆內存中,變量名保存在棧內存中,通過變量名可以訪問堆內存中的對象;匿名對象只存在于堆內存中,無法通過變量名訪問 | 理解堆棧內存模型對于掌握對象存儲和訪問機制至關重要 |
32.兩個對象指向同一片空間
知識點 | 核心內容 | 重點 |
對象內存分配原理 | 兩個對象變量指向同一內存空間時的數據共享機制 | 地址值傳遞導致的對象關聯性 |
引用類型變量賦值 | 通過Phone p2 = p1實現對象引用傳遞 | 直接賦值與new創建的本質區別 |
堆棧內存交互 | 棧內存存儲引用地址,堆內存存儲實際對象數據 | 方法區存儲類模板的class對象 |
對象屬性修改影響 | 通過任一引用修改屬性會同步影響所有關聯對象 | 多引用操作同一對象的副作用 |
內存圖繪制方法 | 三區域劃分(棧/堆/方法區)與地址指向關系 | 數組與對象內存模型的相似性 |
33.成員變量和局部變量
知識點 | 核心內容 | 重點 |
成員變量 vs 局部變量 | 定義位置不同:成員變量在類中方法外,局部變量在方法內或參數位置 | 初始化值差異:成員變量有默認值,局部變量需手動賦值 |
作用范圍不同:成員變量作用于整個類,局部變量僅限所在方法 | 內存位置:成員變量在堆中,局部變量在棧中(非重點) | |
生命周期不同:成員變量隨對象創建/銷毀,局部變量隨方法調用/結束(非重點) | ||
成員變量默認值規則 | 未手動賦值時,成員變量自動賦予默認值(如String為null) | 易錯點:局部變量未賦值直接使用會報錯 |
作用域驗證示例 | Person類中name(成員變量)可在所有方法調用,而方法內變量(如i)僅限本方法 | 混淆點:誤將局部變量跨方法調用 |
模塊八
34.封裝?private
知識點 | 核心內容 | 重點 |
封裝的概念 | 將代碼片段放入方法中隱藏實現細節,對外提供公共接口(方法名)調用 | 區分“代碼封裝”與“屬性封裝”的異同 |
private關鍵字 | 私有化修飾成員變量/方法,限制僅本類訪問,強制通過公共接口間接操作 | 不合理賦值問題(如年齡賦負值)的解決方案 |
封裝的實際應用 | 1. 方法封裝代碼邏輯; 2. private封裝屬性+公共setter/getter控制賦值邏輯 | setter方法中加入有效性校驗(如if(age>0)) |
封裝的優勢 | 1. 隱藏實現細節; 2. 增強數據安全性; 3. 降低耦合度 | 對比public與private的訪問權限差異 |
案例演示 | 1. 數組打印方法封裝; 2. Person類屬性私有化+setAge校驗 | 易錯點:忘記提供公共訪問接口導致數據無法操作 |
35.get set方法
知識點 | 核心內容 | 重點 |
封裝思想 | 使用private隱藏屬性細節,通過get/set方法提供公共訪問接口 | 私有化屬性后仍需通過方法控制賦值有效性(如setAge中校驗負值) |
get/set方法作用 | set用于屬性賦值(可加入邏輯校驗),get用于屬性取值 | 方法內可直接訪問本類私有成員(與外部調用區別) |
封裝實現流程 | 1. 屬性私有化 → 2. 編寫帶校驗的set方法 → 3. 編寫get方法 → 4. 外部通過方法間接訪問 | 校驗邏輯需覆蓋邊界值(如年齡>150) |
封裝優勢 | 防止不合理賦值(如age=-18)、隱藏實現細節、統一訪問入口 | private限制的是外部直接訪問而非本類內部訪問 |
36.this關鍵字
知識點 | 核心內容 | 重點 |
this關鍵字基本使用 | 通過this區分重名成員變量與局部變量,遵循就近原則(默認訪問局部變量) | 成員變量與局部變量重名時的訪問優先級 |
this代表當前對象 | this指向調用該方法的對象,通過輸出對象地址值驗證(person與person2調用時this指向不同) | 動態綁定機制:this具體指向由調用對象決定 |
標準get/set方法改造 | 形參與成員變量同名時,用this.變量名明確賦值目標(如this.name = name) | 未用this會導致局部變量自賦值(age=age無效) |
代碼示例分析 | speak()方法中this.name輸出成員變量,name輸出局部變量(傳參"劉彥昌") | 輸出結果差異:this.name為"沉香",name為"劉彥昌" |
對象調用驗證 | person.speak()與person2.speak()中this分別指向不同對象地址 | 通過分割線對比兩對象地址值及this指向 |
37.構造方法
知識點 | 核心內容 | 重點 |
構造方法定義 | 方法名與類名一致,用于初始化對象,無返回值(連void也不寫) | 易混淆:new 類名()實際調用的是構造方法,而非創建類本身 |
構造方法分類 | 無參構造(默認存在,虛擬機自動提供)、有參構造(為屬性賦值)、滿參構造(為所有屬性賦值) | 重點:默認無參構造在類中未顯式定義時仍存在 |
無參構造特點 | 格式:public 類名(){};作用:僅用于new對象 | 易錯點:手動定義后,默認無參構造失效 |
構造方法調用 | 通過new關鍵字隱式調用(無需對象.操作) | 示例:Person p = new Person();直接觸發無參構造執行 |
IDEA快捷操作 | 自動生成get/set方法和構造方法(如Alt+Insert) |
知識點 | 核心內容 | 考試重點/易混淆點 |
有參構造 | 定義格式:public 類名(參數列表){為屬性賦值} | 與無參構造的區別、如何為屬性賦值 |
作用:創建對象的同時為屬性賦值 | 有參構造與set方法的區別 | |
寫法示例:public Person(String name, int age){this.name=name; this.age=age;} | 構造方法重載(參數列表不同) | |
注意:手寫有參構造后,無參構造需手動添加 | 虛擬機默認提供無參構造,手寫有參后不再自動提供 | |
屬性賦值 | 通過有參構造、set方法為屬性賦值 | 私有屬性如何通過有參構造和set方法賦值 |
方法調用 | 按住Ctrl鍵,鼠標點擊方法名可快速定位到方法定義 | 如何快速找到調用的方法 |
get/set方法 | get方法用于獲取屬性值,set方法用于設置屬性值 | get/set方法的作用、使用場景 |
構造方法重載 | 多個構造方法,參數列表不同 | 構造方法重載的意義、如何實現 |
38.JavaBean
知識點 | 核心內容 | 重點 |
Java Bean定義 | 符合特定規范的Java類: 1. 公共類(public class); 2. 提供無參/有參構造方法; 3. 成員變量私有化; 4. 提供get/set方法 | 易混淆點: - 非私有屬性也可提供get/set,但無實際意義 |
分層架構與分包 | 開發時按功能分包: - controller(表現層); - service(業務層); - dao(持久層); - pojo(存放Java Bean); - util(工具類) | 重點: - 包名規范(公司域名倒寫); - 類的職責隔離 |
Java Bean使用場景 | 1. 通過set方法或有參構造賦值; 2. 通過get方法取值; 3. 實體類統一存放于pojo包 | 易錯點: - 無參構造方法體通常為空 |
39.javabean參與添加功能
知識點 | 核心內容 | 易混淆點/關鍵細節 | 參與環節 |
三層架構 | 表現層(Controller)、業務層(Service)、持久層(DAO)的分工 | 表現層僅處理請求/響應,業務邏輯應集中在Service層 | 整體框架設計 |
注冊功能流程 | 1. 頁面輸入 → 2. Controller獲取參數 → 3. 封裝為JavaBean → 4. 逐層傳遞至DAO → 5. 數據庫操作 | 參數封裝必要性(避免多參數傳遞混亂) | 功能實現核心鏈路 |
JavaBean作用 | 數據打包(如User對象含ID、用戶名、密碼)、跨層傳輸、屬性提取(get/set方法) | 與DTO/VO的區別(本例未涉及分層模型) | 數據封裝與傳遞 |
DAO層邏輯 | 1. 用戶名查重 → 2. 無重復則插入數據 | 查詢與插入的原子性 | 數據庫交互 |
響應控制 | Controller根據Service返回結果(如1/0)動態響應頁面 | 狀態碼設計(可擴展為枚舉/常量) | 結果反饋 |
模塊九
40.static關鍵字
知識點 | 核心內容 | 重點 |
static關鍵字 | 用于修飾成員變量和方法,使成員屬于類而非對象,實現數據共享 | 靜態成員與非靜態成員的內存加載順序(靜態優先) |
靜態成員特點 | 1. 類加載時即存在; 2. 通過類名直接調用; 3. 所有對象共享同一靜態成員 | 區分類名.靜態成員與對象.非靜態成員的調用方式 |
應用場景 | 解決多對象共享屬性問題(如班級換教室只需修改一次靜態變量) | 靜態方法中不可直接調用非靜態成員(需先實例化對象) |
內存機制 | 靜態成員存儲在方法區,非靜態成員存儲在堆內存對象中 | 易混淆:靜態成員生命周期與類相同,非靜態成員與對象綁定 |
代碼示例 | static String classroom = "111";; 修改時:Student.classroom = "222"; | 需注意靜態變量初始化的線程安全問題 |
41.static內存說明
知識點 | 核心內容 | 重點 |
static成員的內存存儲位置 | 靜態成員存儲在靜態域中,靜態域在JDK 6時位于方法區(永久代),JDK 7開始移至堆內存 | 方法區 vs. 堆內存:JDK 7后靜態域遷移至堆,目的是提高內存回收效率 |
方法區的演變 | JDK 6稱“永久代”,JDK 8改為“元空間”,但均為方法區的具體實現 | 永久代、元空間與方法區的關系:需明確三者是同一邏輯區域的不同實現 |
靜態域遷移原因 | 堆內存回收效率高,方法區回收效率低;遷移后可及時釋放靜態成員占用的內存 | 為什么靜態域不留在方法區?:避免內存長期占用,優化運行性能 |
靜態成員共享機制 | 靜態成員隨類加載而加載,被該類的所有對象共享;不屬于對象成員,僅屬于類 | 靜態成員訪問方式:直接通過類名調用(如Student.classroom),無需實例化對象 |
內存模型示例(Student類) | classroom(靜態)存儲在堆的靜態區,name(實例)存儲在對象堆內存;新建對象共享靜態成員 | 對象與靜態區的關系:對象通過內存地址共享靜態成員,但靜態成員生命周期獨立于對象 |
42.靜態成員訪問特點
知識點 | 核心內容 | 重點 |
靜態方法訪問非靜態成員 | 靜態方法中不能直接訪問非靜態成員,需通過new對象調用 | 先出生的靜態成員無法直接訪問后出生的非靜態成員(類比秦始皇不知康熙存在) |
非靜態方法訪問靜態成員 | 非靜態方法中能直接訪問靜態成員(同類可直接調用/類名調用,不同類需類名調用) | 反編譯證明即使通過對象調用靜態方法,底層仍是類名調用 |
靜態方法訪問靜態成員 | 靜態方法中能直接訪問靜態成員(同類可直接調用,不同類需類名調用) | 同類訪問時存在兩種調用方式(直接調用/類名調用) |
非靜態方法訪問非靜態成員 | 非靜態方法中能直接訪問非靜態成員(同類直接調用,不同類需new對象調用) | 同類訪問時new對象調用非必要但可行 |
通用訪問規則總結 | 非靜態成員始終通過new對象調用;靜態成員始終推薦類名調用 | 靜態成員生命周期早于非靜態成員(類加載vs對象實例化) |
43.靜態成員的使用場景
知識點 | 核心內容 | 重點 |
靜態成員的使用場景 | 靜態成員通過類名直接調用,無需實例化,適用于工具類等場景 | 靜態成員與實例成員的區別(內存加載時機) |
靜態成員的局限性 | 所有靜態成員會在類加載時占用內存,濫用會導致內存浪費 | 需權衡“便利性”與“資源占用” |
工具類設計規范 | 1. 成員全靜態化; 2. 構造方法私有化(禁止實例化); 3. 功能需高頻復用(如數組求最大值) | 工具類與普通類的設計差異 |
代碼復用案例 | 抽取ArrayUtils.getMax()方法,避免重復編寫數組遍歷邏輯 | 工具類方法的通用性設計(參數/返回值) |
44.可變參數
知識點 | 核心內容 | 注意事項 |
可變參數定義 | 使用數據類型...變量名語法定義(必須三個點) | 必須三個點,兩個或四個點都不行 |
可變參數本質 | 底層實現是數組(可通過反編譯驗證) | 可使用數組遍歷方式操作可變參數 |
參數位置規則 | 可變參數必須放在參數列表最后 | 報錯提示:varargs parameter must be the last |
多參數共存 | 可與普通參數共存(如int i, int... arr) | 普通參數需在前,順序不可顛倒 |
方法調用方式 | 可傳入任意數量同類型參數(自動轉為數組) | 類型必須匹配定義的數據類型 |
45.遞歸
知識點 | 核心內容 | 重點 |
遞歸的定義 | 方法內部調用自身的編程技巧 | 與循環的區別(出口條件的必要性) |
遞歸的經典案例 | "從前有座山"的無限循環故事 | 無出口的遞歸導致棧溢出錯誤 |
遞歸的分類 | 直接遞歸(方法A調A)和間接遞歸(方法A→B→C→A循環調用) | 間接遞歸的代碼實現邏輯 |
遞歸的注意事項 | 必須設置終止條件(出口),且遞歸次數不宜過多 | 棧內存溢出的原理(StackOverflowError) |
遞歸的代碼演示 | method()無限調用自身導致崩潰 | 實際開發中需通過條件判斷控制遞歸深度 |
46.斐波那契數列
知識點 | 核心內容 | 重點 |
斐波那契數列定義 | 數列中每個數字是前兩個數字之和(從1,1開始) | 起始項定義(通常為F(1)=1, F(2)=1) |
兔子繁殖模型 | 1.新生兔1個月成熟; 2.成熟后每月生1對; 3.無死亡假設 | 第二個月不生兔的時間延遲特性 |
遞歸算法實現 | method(n) = method(n-1) + method(n-2) | 終止條件必須包含n=1和n=2的情況 |
數列計算示例 | 月份:1→1對, 2→1對, 3→2對, 4→3對, 5→5對, 6→8對 | 第6個月結果8對的推導過程 |
遞歸調用過程 | 方法自調用時的參數傳遞機制(月份遞減) | 遞歸樹展開時的重復計算問題 |
47.數組反轉
知識點 | 核心內容 | 重點 |
數組翻轉算法 | 中心思想是數組對稱索引位置上的元素互換,通過中間變量實現元素位置交換 | 確定交換終止條件(min >= max)和索引移動規則(min++/max--) |
索引對稱原理 | 奇數數組中間元素自對稱,偶數數組全部成對交換(圖示[1,2,3,4,5,6,7]與[7,6,5,4,3,2,1]索引對應關系) | 奇偶數組的不同處理邏輯 |
元素交換技術 | 使用臨時變量temp的三步交換法: 1. temp = arr[min]; 2. arr[min] = arr[max]; 3. arr[max] = temp | 類比水杯交換的具象化理解 |
循環控制邏輯 | for(int min=0,max=arr.length-1; min<max; min++,max--) 復合循環條件寫法 | 多語句初始化/迭代的語法特性 |
邊界條件處理 | 循環終止條件min < max同時覆蓋奇偶兩種情況 | 避免偶數數組重復交換 |
48.冒泡排序
知識點 | 核心內容 | 重點 |
冒泡排序定義 | 數組排序方法,通過相鄰元素比較和交換實現排序 | 默認升序排序,需理解“相鄰元素”指 arr[i] 和 arr[i+1] |
排序過程 | 1. 每輪將最大值“冒泡”到末尾; 2. 比較輪數=數組長度-1,每輪比較次數遞減 | 易錯點:忽略每輪減少一次比較(已排序部分無需重復比較) |
代碼實現關鍵 | 1. 雙重循環(外層控制輪數,內層控制比較次數); 2. 相鄰元素交換條件 arr[i] > arr[i+1] | 筆試高頻:需默寫代碼框架及邊界條件(如 i < arr.length-1) |
性能特點 | 時間復雜度 O(n2),空間復雜度 O(1) | 對比其他排序:效率低但實現簡單,適合小規模數據 |
實例演示 | 數組 [5,4,3,2,1] 的完整排序步驟(4輪比較,每輪次數遞減) | 重點觀察:最大值如何逐步移動到末尾 |
49.二分查找
知識點 | 核心內容 | 重點 |
二分查找原理 | 通過不斷折半縮小查找范圍,提升查詢效率 | 必須保證數組有序(升序/降序) |
中間索引計算 | mid = (min + max) // 2,動態調整min/max | 初始min=0,max=長度-1,非固定長度/2 |
查找流程 | 1. 比較目標值與mid元素; 2. 大于則min=mid+1; 3. 小于則max=mid-1; 4. 等于則命中 | 終止條件:min > max時未找到 |
效率對比 | 原始遍歷:O(n); 二分查找:O(log n) | 數據量越大優勢越顯著(例:100數據僅需7次比較) |
邊界案例 | 目標值在首尾/不存在時索引移動邏輯 | min/max更新需嚴格±1,避免死循環 |
50.對象數組
知識點 | 核心內容 | 重點 |
對象數組定義 | Person[]數組存儲Person對象,數組定義語法與基本類型數組類似 | 數組元素類型與對象類型的匹配關系 |
對象數組初始化 | 創建三個Person對象并存入數組,通過索引賦值 | 數組存儲的是對象引用(地址值)而非對象本身 |
數組遍歷與屬性訪問 | 使用for循環遍歷數組,通過getter方法獲取對象屬性 | 遍歷得到的是對象引用,需通過引用訪問成員方法 |
內存模型解析 | 堆內存中數組元素存儲對象引用示意圖 | 引用傳遞與值傳遞的本質區別 |
類型系統應用 | 接收數組元素必須使用Person類型變量 | 編譯期類型檢查機制 |
51.對象數組應用
知識點 | 核心內容 | 重點 |
對象數組創建 | 創建Student類數組并初始化三個學生對象 Student[] students = new Student[3] | 匿名對象初始化方式 |
類定義規范 | 定義Student類包含私有屬性(name/score)和標準方法(構造器/getter) | 無參/有參構造器同時存在的必要性 |
冒泡排序算法 | 通過嵌套循環實現對象數組排序 | 比較成績但交換整個對象 |
對象屬性訪問 | 通過getter方法獲取私有屬性進行比較 | 直接訪問私有屬性會導致編譯錯誤 |
數組遍歷輸出 | 排序后遍歷數組輸出學生信息 | 注意數組越界問題 |
52.基本類型做參數傳遞
知識點 | 核心內容 | 重點 |
基本數據類型與引用數據類型的區分 | 基本數據類型包括四類八種(byte、short、int、long、float、double、char、boolean),其余均為引用數據類型 | 如何快速區分:只需記住基本數據類型的范圍,其余均為引用類型 |
方法參數傳遞(基本數據類型) | 基本數據類型作為方法參數傳遞時,傳遞的是值而非變量本身,方法內部的修改不影響原始變量 | 易混淆點:誤認為方法內部修改會影響原變量值 |
方法調用與棧內存機制 | 方法執行時壓棧,運行完畢后彈棧,局部變量僅作用于當前方法棧幀 | 關鍵理解:方法棧的獨立性導致變量作用域隔離 |
53.引用類型作參數傳遞
知識點 | 核心內容 | 重點 |
引用數據類型作為方法參數傳遞 | 引用數據類型(如數組)作為參數傳遞時,傳遞的是地址值,而非值本身。 | 區分基本數據類型和引用數據類型的參數傳遞方式;理解為何引用數據類型的修改會影響到原數據。 |
數組在內存中的存儲 | 數組在堆內存中存儲,變量保存的是數組的地址值。 | 數組的內存分配和地址值的概念;數組如何通過地址值進行訪問和修改。 |
方法調用與棧的壓棧彈棧 | 方法調用時,會在棧中壓棧運行;方法執行完畢后,會彈棧返回。 | 方法調用的棧機制;壓棧與彈棧對變量值的影響。 |
方法間參數傳遞的影響 | 引用數據類型作為參數傳遞時,方法間的修改會相互影響。 | 引用傳遞導致的修改共享問題;如何理解并避免不必要的修改。 |
基本數據類型與引用數據類型的區別 | 基本數據類型傳遞的是值,引用數據類型傳遞的是地址值。 | 兩者在參數傳遞、內存存儲和修改影響上的區別。 |
54.命令行參數
知識點 | 核心內容 | 重點 |
命令行參數 | 指main方法中的String[] args參數,通過命令行或IDE配置傳遞實參 | 參數傳遞格式(空格分隔)、IDE配置入口位置 |
參數傳遞方式 | 1. 命令行運行:java 類名 參數1 參數2; 2. IDEA配置:Run → Edit Configurations → Program Arguments | 參數與類名需空格分隔,參數按順序對應數組元素 |
實際應用場景 | 臨時測試方法功能(如method(String s1, String s2)),避免啟動完整項目流程 | 與直接調用方法的區別(靈活性 vs 便捷性) |
IDE操作演示 | 1. 創建類并編寫main方法; 2. 通過Edit Configurations設置參數(如哈哈 嘿嘿); 3. 運行后遍歷args數組輸出結果 | 配置路徑易忽略(需通過類名旁箭頭進入) |
55.快速生成方法
知識點 | 核心內容 | 重點 |
方法定義與調用順序 | 初學者需先定義方法再調用,否則報錯;熟練者可先調用后定義(通過IDE補全) | Alt+Enter快速生成方法(自動補全參數/返回值) |
IDE智能補全功能 | 使用Alt+Enter自動生成方法: - 無參無返回值(默認private修飾); - 有參無返回值(自動匹配參數類型); - 有返回值(自動推斷類型) | 修飾符需手動調整 |
代碼抽取為方法 | 選中代碼塊后按Ctrl+Alt+M快速抽取: - 自動識別依賴變量(如數組參數); - 支持修改方法名/修飾符; - 智能提示返回值需求 | 未選中變量時自動補全參數 |
IDE操作效率技巧 | - 通過快捷鍵生成代碼結構; - 抽取重復邏輯為獨立方法 | 需熟悉Alt+Enter與Ctrl+Alt+M組合鍵 |
56.debug調試
知識點 | 核心內容 | 重點 |
Debug調試概述 | 調試代碼的手段,用于監測變量變化和定位錯誤 | 理解斷點作用與調試模式啟動方式 |
斷點設置 | 在代碼行左側點擊添加紅色圓點(斷點),右鍵選擇Debug啟動調試 | 斷點可多位置設置,點擊消失的特性易忽略 |
調試面板功能 | - 下一步(逐行執行); - 進入方法(跳轉至被調用方法內部); - 跳出方法(返回調用處); - 放行(執行當前請求代碼但不退出調試); - 結束調試(完全退出) | 放行 vs 結束調試的功能差異(是否保留調試模式) |
變量監控 | 調試過程中實時顯示變量值變化(如數組索引賦值過程) | 通過變量面板觀察I=3時的數組越界問題 |
調試應用場景 | 示例:購物車功能調試(addCart方法逐行檢查變量) | 結合循環調用演示放行按鈕的多次觸發特性 |