完成目標:
comment.java
package com.zcr.pojo;
import org.hibernate.annotations.GenericGenerator;import javax.persistence.*;
//JPA操作表中數據,可以將對應的實體類映射到一張表上@Entity(name = "t_comment")//表示當前的實體類與哪張表進行直接映射,自動將表中的字段名稱與實體類中的屬性名稱進行一一映射
public class Comment {@Id //表示指定實體類中用于數據映射的主鍵@GeneratedValue(generator = "uuid")@GenericGenerator(name = "uuid", strategy = "uuid2")@Column(name = "id")private String id;@Column(name = "article_id")private Integer articleID;@Column(name = "content")private String content;@Column(name = "author")private String author;//alt+insert 快捷鍵生成get,set方法public Integer getArticleID() {return articleID;}public void setArticleID(Integer articleID) {this.articleID = articleID;}public String getId() {return id;}public void setId(String id) {this.id = id;}public String getContent() {return content;}public void setContent(String content) {this.content = content;}public String getAuthor() {return author;}public void setAuthor(String author) {this.author = author;}@Overridepublic String toString() {return "Comment{" +"id=" + id +", articleID=" + articleID +", content='" + content + '\'' +", author='" + author + '\'' +'}';}
}
學習java課程170-200
知識點:
1.static關鍵字
知識點 | 核心內容 | 重點 |
static關鍵字 | 用于修飾成員變量和方法,使成員屬于類而非對象,實現數據共享 | 靜態成員與非靜態成員的內存加載順序(靜態優先) |
靜態成員特點 | 1. 類加載時即存在; 2. 通過類名直接調用; 3. 所有對象共享同一靜態成員 | 區分類名.靜態成員與對象.非靜態成員的調用方式 |
應用場景 | 解決多對象共享屬性問題(如班級換教室只需修改一次靜態變量) | 靜態方法中不可直接調用非靜態成員(需先實例化對象) |
內存機制 | 靜態成員存儲在方法區,非靜態成員存儲在堆內存對象中 | 易混淆:靜態成員生命周期與類相同,非靜態成員與對象綁定 |
代碼示例 | static String classroom = "111";; 修改時:Student.classroom = "222"; | 需注意靜態變量初始化的線程安全問題 |
2.static內存說明
知識點 | 核心內容 | 重點 |
static成員的內存存儲位置 | 靜態成員存儲在靜態域中,靜態域在JDK 6時位于方法區(永久代),JDK 7開始移至堆內存 | 方法區 vs. 堆內存:JDK 7后靜態域遷移至堆,目的是提高內存回收效率 |
方法區的演變 | JDK 6稱“永久代”,JDK 8改為“元空間”,但均為方法區的具體實現 | 永久代、元空間與方法區的關系:需明確三者是同一邏輯區域的不同實現 |
靜態域遷移原因 | 堆內存回收效率高,方法區回收效率低;遷移后可及時釋放靜態成員占用的內存 | 為什么靜態域不留在方法區?:避免內存長期占用,優化運行性能 |
靜態成員共享機制 | 靜態成員隨類加載而加載,被該類的所有對象共享;不屬于對象成員,僅屬于類 | 靜態成員訪問方式:直接通過類名調用(如Student.classroom),無需實例化對象 |
內存模型示例(Student類) | classroom(靜態)存儲在堆的靜態區,name(實例)存儲在對象堆內存;新建對象共享靜態成員 | 對象與靜態區的關系:對象通過內存地址共享靜態成員,但靜態成員生命周期獨立于對象 |
3.靜態成員訪問特點
知識點 | 核心內容 | 重點 |
靜態方法訪問非靜態成員 | 靜態方法中不能直接訪問非靜態成員,需通過new對象調用 | 先出生的靜態成員無法直接訪問后出生的非靜態成員(類比秦始皇不知康熙存在) |
非靜態方法訪問靜態成員 | 非靜態方法中能直接訪問靜態成員(同類可直接調用/類名調用,不同類需類名調用) | 反編譯證明即使通過對象調用靜態方法,底層仍是類名調用 |
靜態方法訪問靜態成員 | 靜態方法中能直接訪問靜態成員(同類可直接調用,不同類需類名調用) | 同類訪問時存在兩種調用方式(直接調用/類名調用) |
非靜態方法訪問非靜態成員 | 非靜態方法中能直接訪問非靜態成員(同類直接調用,不同類需new對象調用) | 同類訪問時new對象調用非必要但可行 |
通用訪問規則總結 | 非靜態成員始終通過new對象調用;靜態成員始終推薦類名調用 | 靜態成員生命周期早于非靜態成員(類加載vs對象實例化) |
4.靜態成員的使用場景
知識點 | 核心內容 | 重點 |
靜態成員的使用場景 | 靜態成員通過類名直接調用,無需實例化,適用于工具類等場景 | 靜態成員與實例成員的區別(內存加載時機) |
靜態成員的局限性 | 所有靜態成員會在類加載時占用內存,濫用會導致內存浪費 | 需權衡“便利性”與“資源占用” |
工具類設計規范 | 1. 成員全靜態化; 2. 構造方法私有化(禁止實例化); 3. 功能需高頻復用(如數組求最大值) | 工具類與普通類的設計差異 |
代碼復用案例 | 抽取ArrayUtils.getMax()方法,避免重復編寫數組遍歷邏輯 | 工具類方法的通用性設計(參數/返回值) |
5.可變參數
知識點 | 核心內容 | 注意事項 |
可變參數定義 | 使用數據類型...變量名語法定義(必須三個點) | 必須三個點,兩個或四個點都不行 |
可變參數本質 | 底層實現是數組(可通過反編譯驗證) | 可使用數組遍歷方式操作可變參數 |
參數位置規則 | 可變參數必須放在參數列表最后 | 報錯提示:varargs parameter must be the last |
多參數共存 | 可與普通參數共存(如int i, int... arr) | 普通參數需在前,順序不可顛倒 |
方法調用方式 | 可傳入任意數量同類型參數(自動轉為數組) | 類型必須匹配定義的數據類型 |
6.遞歸
知識點 | 核心內容 | 重點 |
遞歸的定義 | 方法內部調用自身的編程技巧 | 與循環的區別(出口條件的必要性) |
遞歸的經典案例 | "從前有座山"的無限循環故事 | 無出口的遞歸導致棧溢出錯誤 |
遞歸的分類 | 直接遞歸(方法A調A)和間接遞歸(方法A→B→C→A循環調用) | 間接遞歸的代碼實現邏輯 |
遞歸的注意事項 | 必須設置終止條件(出口),且遞歸次數不宜過多 | 棧內存溢出的原理(StackOverflowError) |
遞歸的代碼演示 | method()無限調用自身導致崩潰 | 實際開發中需通過條件判斷控制遞歸深度 |
7.斐波那契數列
知識點 | 核心內容 | 重點 |
斐波那契數列定義 | 數列中每個數字是前兩個數字之和(從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對的推導過程 |
遞歸調用過程 | 方法自調用時的參數傳遞機制(月份遞減) | 遞歸樹展開時的重復計算問題 |
8.數組反轉
知識點 | 核心內容 | 重點 |
數組翻轉算法 | 中心思想是數組對稱索引位置上的元素互換,通過中間變量實現元素位置交換 | 確定交換終止條件(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同時覆蓋奇偶兩種情況 | 避免偶數數組重復交換 |
9.冒泡排序
知識點 | 核心內容 | 重點 |
冒泡排序定義 | 數組排序方法,通過相鄰元素比較和交換實現排序 | 默認升序排序,需理解“相鄰元素”指 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輪比較,每輪次數遞減) | 重點觀察:最大值如何逐步移動到末尾 |
10.二分查找
知識點 | 核心內容 | 重點 |
二分查找原理 | 通過不斷折半縮小查找范圍,提升查詢效率 | 必須保證數組有序(升序/降序) |
中間索引計算 | 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,避免死循環 |
11.對象數組
知識點 | 核心內容 | 重點 |
對象數組定義 | Person[]數組存儲Person對象,數組定義語法與基本類型數組類似 | 數組元素類型與對象類型的匹配關系 |
對象數組初始化 | 創建三個Person對象并存入數組,通過索引賦值 | 數組存儲的是對象引用(地址值)而非對象本身 |
數組遍歷與屬性訪問 | 使用for循環遍歷數組,通過getter方法獲取對象屬性 | 遍歷得到的是對象引用,需通過引用訪問成員方法 |
內存模型解析 | 堆內存中數組元素存儲對象引用示意圖 | 引用傳遞與值傳遞的本質區別 |
類型系統應用 | 接收數組元素必須使用Person類型變量 | 編譯期類型檢查機制 |
12.對象數組應用
知識點 | 核心內容 | 重點 |
對象數組創建 | 創建Student類數組并初始化三個學生對象 Student[] students = new Student[3] | 匿名對象初始化方式 |
類定義規范 | 定義Student類包含私有屬性(name/score)和標準方法(構造器/getter) | 無參/有參構造器同時存在的必要性 |
冒泡排序算法 | 通過嵌套循環實現對象數組排序 | 比較成績但交換整個對象 |
對象屬性訪問 | 通過getter方法獲取私有屬性進行比較 | 直接訪問私有屬性會導致編譯錯誤 |
數組遍歷輸出 | 排序后遍歷數組輸出學生信息 | 注意數組越界問題 |
13.基本類型做參數傳遞
知識點 | 核心內容 | 重點 |
基本數據類型與引用數據類型的區分 | 基本數據類型包括四類八種(byte、short、int、long、float、double、char、boolean),其余均為引用數據類型 | 如何快速區分:只需記住基本數據類型的范圍,其余均為引用類型 |
方法參數傳遞(基本數據類型) | 基本數據類型作為方法參數傳遞時,傳遞的是值而非變量本身,方法內部的修改不影響原始變量 | 易混淆點:誤認為方法內部修改會影響原變量值 |
方法調用與棧內存機制 | 方法執行時壓棧,運行完畢后彈棧,局部變量僅作用于當前方法棧幀 | 關鍵理解:方法棧的獨立性導致變量作用域隔離 |
14.引用類型作參數傳遞
知識點 | 核心內容 | 重點 |
引用數據類型作為方法參數傳遞 | 引用數據類型(如數組)作為參數傳遞時,傳遞的是地址值,而非值本身。 | 區分基本數據類型和引用數據類型的參數傳遞方式;理解為何引用數據類型的修改會影響到原數據。 |
數組在內存中的存儲 | 數組在堆內存中存儲,變量保存的是數組的地址值。 | 數組的內存分配和地址值的概念;數組如何通過地址值進行訪問和修改。 |
方法調用與棧的壓棧彈棧 | 方法調用時,會在棧中壓棧運行;方法執行完畢后,會彈棧返回。 | 方法調用的棧機制;壓棧與彈棧對變量值的影響。 |
方法間參數傳遞的影響 | 引用數據類型作為參數傳遞時,方法間的修改會相互影響。 | 引用傳遞導致的修改共享問題;如何理解并避免不必要的修改。 |
基本數據類型與引用數據類型的區別 | 基本數據類型傳遞的是值,引用數據類型傳遞的是地址值。 | 兩者在參數傳遞、內存存儲和修改影響上的區別。 |
15.命令行參數
知識點 | 核心內容 | 重點 |
命令行參數 | 指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數組輸出結果 | 配置路徑易忽略(需通過類名旁箭頭進入) |
16.快速生成方法
知識點 | 核心內容 | 重點 |
方法定義與調用順序 | 初學者需先定義方法再調用,否則報錯;熟練者可先調用后定義(通過IDE補全) | Alt+Enter快速生成方法(自動補全參數/返回值) |
IDE智能補全功能 | 使用Alt+Enter自動生成方法: - 無參無返回值(默認private修飾); - 有參無返回值(自動匹配參數類型); - 有返回值(自動推斷類型) | 修飾符需手動調整 |
代碼抽取為方法 | 選中代碼塊后按Ctrl+Alt+M快速抽取: - 自動識別依賴變量(如數組參數); - 支持修改方法名/修飾符; - 智能提示返回值需求 | 未選中變量時自動補全參數 |
IDE操作效率技巧 | - 通過快捷鍵生成代碼結構; - 抽取重復邏輯為獨立方法 | 需熟悉Alt+Enter與Ctrl+Alt+M組合鍵 |
17..debug調試
知識點 | 核心內容 | 重點 |
Debug調試概述 | 調試代碼的手段,用于監測變量變化和定位錯誤 | 理解斷點作用與調試模式啟動方式 |
斷點設置 | 在代碼行左側點擊添加紅色圓點(斷點),右鍵選擇Debug啟動調試 | 斷點可多位置設置,點擊消失的特性易忽略 |
調試面板功能 | - 下一步(逐行執行); - 進入方法(跳轉至被調用方法內部); - 跳出方法(返回調用處); - 放行(執行當前請求代碼但不退出調試); - 結束調試(完全退出) | 放行 vs 結束調試的功能差異(是否保留調試模式) |
變量監控 | 調試過程中實時顯示變量值變化(如數組索引賦值過程) | 通過變量面板觀察I=3時的數組越界問題 |
調試應用場景 | 示例:購物車功能調試(addCart方法逐行檢查變量) | 結合循環調用演示放行按鈕的多次觸發特性 |