根據定義方式有三種代碼塊形式
局部代碼塊
定義位置: 在方法體內定義
特點: 生命週期即短
使用場景: if和for等語句的代碼塊
初始化代碼塊
定義方式: 在類內但方法體外定義,不要static修飾
本質: 初始化代碼塊的執行語句都移至構造器,被最先執行
靜態代碼塊
定義方式: 定義在類中,用static修飾該代碼塊
特點: 隨着類字節碼文件加載而加載,只會執行一次
使用場景: 應用於資源的加載和功能初始化工作
拓展: 所有在定義處就初始化的靜態字段底層是在靜態代碼塊中進行初始化工作
final關鍵字
why: 爲了更好地進行數據封裝,不讓外部進行修改
final + 類
不能有子類
final + 方法
該方法被繼承後,但不能被重寫
final + 變量
final修飾的變量被作爲常量看待,一旦初始化成功後無法再改變
final能修飾的三種變量: 實例變量 靜態變量, 局部變量
- final修飾基本數據類型表示無法更改其值
- final修飾引用類型表示無法更改其引用
注意 final是唯一能修飾局部變量的修飾符,主要用在 內部類 使用
初始化位置: 只有兩個位置進行初始化: 在定義時初始化或者構造器中初始化
命名規範: 針對final常量採用全大寫,單詞間用_進行分割的方式來命名
拓展 全局靜態常量 - public static final 修飾的變量
單例設計模式
單例設計模式目的就是爲了保證某一個應用中某一個類有且只有一個實例,即所有指向該類型實例的引用都指向同一塊內存空間。
爲什麼用單例
特點在哪
什麼是設計模式: 一套被反覆使用、多數人知曉的、經過分類編目的、代碼設計經驗的總結
Java如何實現單例模式
餓漢模式: 首次加載類時就創建單例對象,且只創建一次
- 在類內部直接創建單例對象用static成員來引用
- 將類的構造器私有化,防止外界調用來創建對象
- 使用一個final修飾的靜態公共方法,用來返回其靜態單例對象的引用
懶漢模式: 首次使用纔會創建單例對象,且只創建一次,但是存在線程安全問題
餓漢模式與懶漢模式區別:
餓漢模式: 類加載時創建單例對象,導致加載類慢,但運行時獲得對象的速度快
懶漢模式: 運行時創建單例對象,導致運行時獲得對象慢,但類加載時快
工具類設計
工具類:存放了某一類事物的工具方法的類.
常見的工具類命名方式: ClassUtil, ClassTool, ClassHelpers等
常見的兩種設計方式
- 工具方法沒有使用static修飾,把工具類設計爲單例,使用工具類的對象來調用.
- 工具方法全部使用static修飾,工具方法用工具類名調用,並必須把工具類的構造器私有化,來防止創建工具類對象調用靜態方法.
基本類型包裝類
Why: 基本數據類型的存在違背了”一切皆對象”的面向對象思想,對數值進行常用的算法操作時也不夠便捷,都需要手動實現
基本數據類 | 包裝類 |
---|---|
byte | Byte |
short | Short |
int | Int |
long | Long |
char | Character |
float | Float |
double | Double |
boolean | Boolean |
注意: 包裝類型和基本數據類型是不同的類型
包裝類的常量
- Boolean包裝類表示true和false有兩種: Boolean.TRUE和 Boolean.FALSE
- 其他包裝類的常量有 MAX_VALUE,MIN_VALUE和SIZE
包裝類構造器
包裝類的構造器分爲兩種: 一種接受自己對於類型的基本類型數值;另一接受字符串參數進行包裝類的創建(Character除外)
注意: 使用第二方式時,如果字符串不能轉換爲對應包裝類就會拋出NumberFormatException異常
裝箱: 將基本類型數據轉換成對應的包裝類對象
自動裝箱: 允許將一個基本數值類型直接賦給對應包裝類變量
拆箱: 將包裝類對象轉換成對應的基本數據類型數據
自動拆箱: 允許把包裝類對象直接賦給對應的基本數據類型變量
Java5後編譯器提供了自動裝箱和自動拆箱的特性,底層仍是普通的裝箱和拆箱;由於自動拆箱的存在,switch接受byte,char,int,,short對應包裝類型參數
包裝類的操作
- 進行數據類型轉換時,每個類都TypeValue方法省去數據的類型強轉操作
- 包裝類創建時,還可以通過valueOf方法來獲得包裝類,可提供字符串或者對應的基本類型數值
- 包裝類提供了parseType系列方法允許將字符串轉換爲對應的基本類型數據,除char外
- Integer包裝類提供了將十進制數值轉換爲其他進制的工具方法toHexString,toBinaryString
包裝類的緩存設計
爲了能提升性能,快捷訪問常用的數據值,避免重複創建對象,某些包裝類都有值緩存,類內部維護一個靜態的緩存數組,來保留常用的小範圍數據.
-
Integer, Byte, Short,Long:緩存[-128,127]區間的數據/
Character緩存[0,127]區間的數據 對於包裝類進行值比較時,一定要用equals方法比較,防止數據緩存帶來的影響
享元設計模式: 本質就是緩存設計,在類內部持有緩存過的數據,避免重複創建對象消耗內存,直接給外部使用
包裝類型與包裝類型的區別
- 默認初始值不同
- 是否有強大的工具方法
- 能否在集合框架使用
- 數據類型不同
最佳實踐: 開發建議使用包裝類型,並且比較時使用equals
抽象設計
保證子類一定實現該方法
抽象方法
What: 用abstract修飾,且沒有方法體的方法
抽象方法的特點
- 沒有方法體,具體實現由子類完成,不實現無法通過編譯
- 抽象方法必須定義在抽象類或接口中
- 該方法不能用final,private,static修飾
抽象類
What: 用abstract修飾,不能創建該類型實例的類
本質: 抽象類必須能被繼承,必須要有子類
抽象類的特點
- 不能創建自己類型的實例
- 允許擁有普通方法,但如果存在抽象方法,則該類必須爲抽象類
- 構造器不能全部私有,不讓繼承
- 類不能用final修飾
- 子類沒有實現全部的抽象方法時,就是抽象子類,也無法創建該子類型對象
- 繼承後子類必須實現其中抽象方法
抽象類與普通類的區別: 抽象類不能創建對象,但允許包含普通方法
When: 當多個類具有相同的方法聲明但具體實現不一樣時可以使用,讓子類覆寫抽象方法進行不同細節的實現
最佳實踐: 給抽象命名時用Abstract作爲前綴
模板方法模式
What: 編寫一個抽象父類,讓該父類提供多個子類的通用方法,並將其中表現不同操作的方真法延遲到子類中實現,由父類的通用方法完成子類具體實現的調用
使用原則:
保證抽象父類提供模板方法和抽象方法;讓模板方法表現各子類共同的行爲和實現,
讓具體的業務功能讓子類在抽象方法中完成,實現模板方法對其具體操作方法的調用,完成該功能.
注意: 模板方法用final修飾防止外部覆寫,而抽象方法用protected防止非子類進行修改