本篇文章更偏向於筆記,是閱讀Java核心卷(一)以後的記錄:java
1. 一個類可能的組成部分:git
1. 成員變量github
2. 成員函數函數
3. 構造函數工具
4. 代碼塊this
5. 靜態變量,靜態函數,靜態代碼塊spa
2. 初始化成員變量的方法:翻譯
1. 聲明時直接賦值debug
2. 代碼塊賦值3d
3. 構造函數中賦值
三種初始化方式的順序:
構造 > 聲明或代碼塊
先聲明仍是先代碼塊看他們在代碼中的順序
能夠在new 的 地方打個斷點,調試一下更清楚
最後輸出 「 構造函數賦值」。
把構造函數注掉就會輸出 「代碼塊賦值」
把聲明和代碼塊的順序變一下就會輸出「聲明時賦值」
此處再也不演示。
3. 構造函數
關於構造函數須要注意的點是:
1. 只有當類沒有提供任何構造器的時候,系統纔會默認提供一個空參的構造函數
2. 能夠在構造函數中利用this調用其餘的構造函數
當你已經寫過構造函數以後,再調用Employee會報錯。
this構造函數就沒什麼好說的了
4. 方法參數(Java 只有值傳遞)
Java方法中的參數傳遞都是值傳遞,沒有引用傳遞,看起來像引用傳遞的對象傳參也只是把引用複製了一份,而後指向了相同的對象。
舉一個反例:
最後輸出e1.name 仍是僱員1。
若是真的是引用傳遞的話,e1 應該就指向了僱員2那個對象了。
因此咱們所認爲的引用傳遞實際上也是值傳遞,只不過傳遞的是引用。既然指向了同一個對象,那麼當對象的內容發生變化的時候,好比你把僱員的名字給改了,那麼原來的對象天然也被修改了,這看上去
很想引用傳遞,但其實不是。
5. static
靜態的成員變量和代碼塊都只會初始化一次。
static 成員變量: 就是全部對象共享的變量,static常與final合用變成靜態常量,例如Math類,有至關多的數學常量在裏面,例如PI
static 代碼塊: static代碼塊中固然就不能對成員變量進行初始化了,通常來講就是對static成員變量進行處理的代碼塊。
加載順序:
強烈建議能夠debug看一下,能夠發現其實在執行static代碼塊的時候還並無id這個成員變量,這裏猜想靜態變量以及它的初始化是在類加載的時候就執行了
因此說靜態的東西加載都比非靜態要早。
可是這裏變量的聲明和代碼塊的初始化的順序是不能顛倒的:
6. 靜態方法
靜態方法的用途:我的理解就是不須要實例化就可以使用的方法,或者說不涉及到成員變量操做的方法,又或者說涉及到了,可是對於每個對象來講須要對成員變量進行的操做是同樣的。
例如在Math類中,它的方法基本上都是Math類的,由於Math根本就不讓你初始化,它的方法都是涉及到一些數學公式的計算,對於全部想要使用這個方法的人來講都是同樣的,並不存在差別化
還有一些工具類中可能更常見:例如說Arrays中的asList方法。
靜態工廠方法:
在一些類中,咱們會使用靜態工廠方法來替代構造方法。在effective-Java 3rd 中 第一條建議就是這個(GitHub上一個自發的翻譯項目,因此可能翻譯質量沒法保證):
這裏面詳述了不少條靜態工廠替代構造方法的優勢和缺點,大部分暫時還看不太懂,這裏只簡單小結兩點(Java 核心捲上總結的兩點):
1. 使用靜態工廠方法相比構造函數更具備語義性,構造函數只能根據參數的不一樣來產生不一樣的對象,而若是有一個名字的話,會清晰許多,例如LocalDate.now() LocalDate.of()
2. 使用構造函數就只能返回本類型,可是使用靜態工廠,返回的類型沒有限制了,因此咱們能夠返回其子類,例如:
NumberFormat currencyInstance = NumberFormat.getCurrencyInstance();