??各位小伙伴們大家好,歡迎來到這個小扎扎的《Java核心技術 卷Ⅰ》筆記專欄,在這個系列專欄中我將記錄淺學這本書所得收獲,鑒于 看到就是學到、學到就是賺到 精神,這波簡直就是血賺
💡涉及的知識點速通
- 🛫 關于包你都知道什么?
- 🪂 包名該如何定義?
- 🪂 什么是無名包?
- 🪂 關于import關鍵字應該知道什么?
- 🛫 什么是單例設計模式?
- 🪂 餓漢式單例模式
- 🪂 懶漢式單例模式
- 🪂 兩種模式的區別
🛫 關于包你都知道什么?
🪂 包名該如何定義?
??為什么要引用包的概念呢?使用包的最主要的原因就是為了保證類名的唯一性,因為使用到類的時候會帶上它的包名,一個包中又不會存在一個簽名一樣的方法,方法簽名的概念參考這篇博客的方法重寫與重載問題部分。
??一般來說,包的命名方式都是采用因特網域名的逆序形式,因為因特網的域名肯定是唯一的。比如說:域名為horstmann.com可以將其包名命名為com.horstman,再追加上工程名為com.horstman.bean,如果再加上類名為com.horstman.bean.Employee,這就組成了這個Employee類的完全限定名
??還有在認知上比較重要的一點就是,從編譯器的角度上來看,嵌套的包與包之間并沒有任何的關系,每一個包都是獨立的一些類的集合。例如java.util包和java.util.jar包之間就毫無關系
🪂 什么是無名包?
??說完包的命名,我們來說一說該如何將一個類放在指定的包中,在源文件的第一行使用package語句指定類所在的包位置,這一步基本上所有的IDE工具在創建類的時候都會自動生成(所以我們就關注的很少)
??如果不使用package指定包位置的話,這個類就直屬于無名包,無名包是最上層的包結構,不使用package指定的類指定的類直屬于無名包,其他的類在無名包下的指定包目錄下間接屬于無名包
🪂 關于import關鍵字應該知道什么?
??一個類可以使用它所屬包中的所有類,以及其他包里的public類,這里的使用指的是,通過實例化對象或者類名調用等方式操作類中的屬性。使用其他包里的public類的方式一共有兩種,一種就是使用該類的全限定名,另外一種就是import??如果需要使用到這個包里的很多類的話,不必一個類一個類的import,可以使用通配符 * 實現
??正如我們所知,Java的核心類庫中存在很多的命名相同的類,如果你import的兩個包中存在名稱相同的類,此時使用這個類會用到哪個?如果這兩個包中的同名類都需要使用的話又該怎么辦?
??import除了可以導類之外還可以具體到類中的靜態屬性,使用import導入類中的static方法字段之后就可以直接使用該靜態屬性,而無需使用類名調用
🛫 什么是單例設計模式?
??所謂類的單例設計模式,就是采取一定的方法保證在這整個系統中一個類只能存在一個實例對象,而且該類中只提供一個獲得它的實例對象的方法。想要完成以上的構想,首先就必須將類構造器的訪問權限設置為private防止隨意在類的外部通過new創建實例對象,類外部無法創建實例對象所以只能通過類內部的靜態方法,所以在類內部使用靜態方法創建并返回該類的對象,由于靜態方法內部只能訪問靜態資源,所以該類對應的對象變量也要定義為靜態的
單例設計模式也為兩種,餓漢式和懶漢式
🪂 餓漢式單例模式
??所謂的餓漢式就像是一個饑餓的人的心態一樣,他想一到家就已經有人做好了飯可以直接吃。對應到Java就是提前創建好該類的實例對象,使用類調動靜態方法的時候直接返回這個已經創建好的對象,所以說使用這種靜態方法創建的對象是同一個,使用==判斷地址一致
🪂 懶漢式單例模式
??所謂的懶漢式就像是一個懶惰的人一樣,等到他餓的時候才去看自己有沒有做飯,有過有的話就直接吃,沒有的話就做完再吃。對應到代碼實現就是,在靜態方法中判斷實例對象變量是否為null,null的話就new個對象返回,不為null的話直接返回
🪂 兩種模式的區別
??所謂的餓漢式和懶漢式的區別就是創建對象的時間不同,餓漢式是類加載的時候就創建好調用就返回,懶漢式則是在靜態方法內部判斷后創建并返回。于是帶來第一個不同點:餓漢模式在類加載的時候就會創建對象,這樣的話就會長時間加載對象導致內存資源的耗費;而懶漢模式只有在調用靜態方法的時候才會創建對象,這樣的話就會延遲創建對象性能就可以得到提高
??但是懶漢模式也并不是都是好處,因為懶漢式涉及到了一個判斷的過程,于是就導致它在多線程并發的環境下會出現安全問題,而餓漢模式是線程安全的。如果想要保證懶漢模式的線程安全,可以在getInstance方法的聲明上加synchronize關鍵字,鎖住方法體使之安全