🏗️ Java 技術棧#
- 程式基礎
- 面向對象
- 陣列
- 異常機制
- 常用 API
- 集合 + Map
- IO 流
- 多執行緒
- 網路程式設計
- 正則表達式
- lambda 表達式 + 函數式介面
- 反射機制
- GUI
📌 Java 方向#
- JavaSE
- JavaME
- JavaWEB
- JavaEE
🔰 Java 特性#
- 多執行緒
- 跨平台
- 面向對象
- 自動垃圾回收
Java 屬於靜態強類型解釋性語言
靜態類型 創建變數時指定資料類型
動態類型 創建變數時無需指定資料類型 運行後賦值時確定資料類型
強類型 需通過強制轉換類型 轉換類型
弱類型 根據程式上下文環境自動修改資料類型
編譯型 使用編譯器來編譯執行的程式語言
解釋型 使用解釋器來解釋執行的程式語言
xxx.java ----->xxx.class ----->Hello World
Windows/Linux/MacOS
- 執行:運行時 JVM 開機,將所運行的類載入記憶體空間中的靜態區
- 加載完成後,JVM 會自動調用該類的 main 方法 (只要是方法調用,就會在堆疊記憶體中開闢堆疊幀並壓堆)
- 如果 main 方法中,有別的方法調用
- 如果調用的是其他類中的方法,則先把對應類加載到靜態區,然後再堆疊記憶體中開闢堆疊幀
- 如果調用的是當前類中的方法,則直接在堆疊記憶體開闢堆疊幀
- 如果被調用的方法中,還有其他方法調用,則繼續開闢堆疊壓堆,一直到堆疊頂部元素,執行完成彈堆 返回上個堆繼續執行
- 直到main 堆幀彈堆,則整個程式生命週期終止
💾 結構#
記憶體存儲#
電子位 bit 八位 一字節
最高位為符號位
記憶體劃分#
靜態區 / 方法區#
保存靜態資源文件 例如靜態變數 方法 運行時的 class 文件等
VM 堆疊#
以堆疊資料結構為模型創建的一塊空間
主要用於執行方法
結構特徵 先進後出
- 堆疊頂部元素 最後放進去的元素
- 堆疊底部元素 第一个放進去的元素
- 堆疊幀 堆疊資料結構中的元素
壓堆 把堆疊幀放到堆疊空間的過程
彈堆 把堆疊幀在堆疊空間彈出去的過程
每當調用一個方法的時候,該方法就會在堆疊記憶體中開闢一個堆疊,並壓堆到堆疊空間。開始執行,方法執行完後 彈堆 堆銷毀
堆記憶體#
保存類物件和成員變數及成員方法
🧾 資料類型#
基本資料類型#
- 數值型
- 整數型
- byte 8bit
- short 16bit
- int 32bit
- long 64bit
- 浮點型
- float 32bit
- double 64bit
- 整數型
- 布林型 boolean
- 字元型 char
注意 ⚠️
- byte
取值127
~-128
- short
取值32767
~-32768
- int
取值2147483647
~-2147483648
- long
需要以L
或l
結尾 - float
需要以F
或f
結尾
由於 float 採用科學計數法進行存儲 float 的 32 位存儲量遠大於long 的 64 位 - double
需要以D
或d
結尾 或不寫 - boolean
只有true
和false
- char
使用單引號表示 並且有且只有一個字元
char 範圍0
~65535
不需要負數
支持 Unicode 編碼 4bit 十六進制整型值 0~f\u0000
~\uffff
引用資料類型#
- 類
- 陣列
- 介面
字串#
\
轉義符
+
字串拼接符
💱 類型轉換#
布林型 不能參與轉換
- 低精度到高精度 可以自動類型轉換
- 高精度 到低精度 需要強制類型轉換
自動類型轉換#
byte --> short --> int --> long --> float --> double
char --> int --> long --> float --> double
強制類型轉換#
多出的高位部分被截斷 有可能損失精度
整數轉換為 char 時 當不考慮符號位時 對應的是 65271
整數轉換為 char 時 忽略負數 將響應負數的二進制轉換為對應的正數 然後再進行 ASCII 碼對照
多類型混合運算#
當進行多類型混合運算時 結果為參與運算的最大類型
當混合運算類型只出現了 byte short int char 四種類型時
任意一種或多種進行運算,結果一定是 int 類型 (可以理解為混合運算的結果為參與運算的最大類型,但最低也是 int 類型)
💬 註解#
單行註解
// XXX
多行註解
/*
* XXX
* YYY
*/
/**
* XXX
* YYY
*/
可生成 Javadoc 文檔
📛 命名#
強制規則 只允許使用大小寫字母、$
、_
、數字(數字不能開頭)不能使用關鍵字和保留字
非強制規則 駝峰命名 見名之意
💩 變數#
全域變數#
全域變數一般是指可以直接調用,不需要二次引用的變數
Java 中不存在全域變數
變數聲明#
使用資料類型劃分記憶體空間 給空間取名,並賦值
變數分類#
分為四類
- 局部變數 在方法中寫的變數
無初始值 需初始化 - 靜態變數 在類體中 被
static
修飾的變數 - 成員變數 在類體中 沒有被
static
修飾的變數 存放在堆記憶體中 - 常量
同時被static
和final
修飾的變數
預設值#
- 整數
0
- 小數
0.0
- 字元
\u0000
- 布林
false
- 引用
null
作用域#
靜態變數調用 使用類名。靜態變數名 需要考慮權限修飾符
區分#
使用類名區分同名的局部變數和靜態變數
使用 this
區分同名的局部變數和成員變數
優先級#
局部變數可以和靜態變數 / 成員變數可同名
靜態變數和成員變數 不可同名
📐 運算符#
算術運算符#
關係運算符#
>
>=
<
<=
==
!=
結果是布林型
==
基本類型比較數值 引用類型比較記憶體地址
邏輯運算符#
&
&&
與
支持與運算 兩邊是數字 即可進行與運算
兩個數轉換為二進制進行每位比較 同 1 取 1 反之取 0 結果不大於兩個數中的最小數|
||
或!
非^
異或 兩邊不一致為真
兩邊是數字進行異或運算 每二進制位進行比較 不同取 1 相同取 0>>
右移運算
右移一次 就相當於該數除 2 (符號位不變)>>>
不考慮符號位 並且不考慮正負數 只在最左邊補0
負數有可能變正數<<
左移運算
向左移動一位 刪除左邊 (非符號位) 右邊補0
相當於該數乘 2
赋值运算符#
+=
-=
*=
/=
%=
計算過程中自動進行強制類型轉換
賦值運算屬於右結合,同優先級從右到左計算
int result = x = y = z = 10;
由於=
的右結合性,先執行 z = 10
; 再執行 y = z
再執行 x = y
運算
三目運算符#
xxx?yyy:zzz
xxx
需要判斷的語句 布林型yyy
判斷為真時執行的語句zzz
判斷為假時執行的語句