重學Java 面向對象 之 封裝

本篇文章更偏向於筆記,是閱讀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上一個自發的翻譯項目,因此可能翻譯質量沒法保證):

effective - Java 3rd 在線版本

 這裏面詳述了不少條靜態工廠替代構造方法的優勢和缺點,大部分暫時還看不太懂,這裏只簡單小結兩點(Java 核心捲上總結的兩點):

1. 使用靜態工廠方法相比構造函數更具備語義性,構造函數只能根據參數的不一樣來產生不一樣的對象,而若是有一個名字的話,會清晰許多,例如LocalDate.now()  LocalDate.of()

2. 使用構造函數就只能返回本類型,可是使用靜態工廠,返回的類型沒有限制了,因此咱們能夠返回其子類,例如:

NumberFormat currencyInstance =  NumberFormat.getCurrencyInstance();
相關文章
相關標籤/搜索