封裝是面向對象的三大特徵之一(另外兩個特徵是繼承和多態)。
封裝是面向對象編程語言對客觀世界的模擬。對一個類或對象實現良好的封裝,可以實現以下目的:
- 隱藏類的實現細節;
- 讓使用者只能通過事先預定的方法來訪問數據,從而可以在該方法里加入控制邏輯,限制對屬性的不合理訪問。
- 可進行數據檢查,從而有利於保證對象信息的完整性。
- 便於修改,提高代碼的可維護性。
爲了實現良好的封裝,需要從兩個方面考慮:
- 將對象的屬性和實現細節隱藏起來,不允許外部直接訪問。
- 把方法暴露出來,讓方法來控制對這些屬性進行安全的訪問和操作。
封裝實際上有兩方面的含義:把該隱藏的隱藏起來,把該暴露的暴露出來。
封裝需要通過使用包和訪問權限修飾符來實現。
一、包和導包
如果希望把函數、類放在指定的包結構下,應該在Kotlin源程序的第一個非註釋行放置如下格式的代碼:
package packagename
位於包中的類,在文件系統中也必須有與包名層次相同的目錄結構。
Kotlin的包需要兩個方面的保證:
- 在源程序中使用package語句指定包名;
- 必須將class文件放在對應的路徑下。
Kotlin的import語法和Java類似,支持精確導入和通配符導入。
精確導入:
import test.Bar
通配符導入:
import foo.*
Kotlin的import不僅可以導入類,還可以導入如下內容:
- 頂層函數及屬性
- 在對象聲明中聲明的函數和屬性
- 枚舉常量
Kotlin的import語句
支持as關鍵字
,可以爲導入類指定別名。
二、Kotlin的默認導入
Kotlin默認會導入如下包:
- kotlin.*
- kotlin.annotation.*
- kotlin.collections.*
- kotlin.comparisons.*
- kotlin.io.*
- kotlin.ranges.*
- kotlin.sequences.*
- kotlin.text.*
對於JVM平臺,還會自動導入如下兩個包:
- java.lang.*
- kotlin.jvm.*
對於JavaScript平臺,則額外導入如下包:
- kotlin.js.*
三、使用訪問控制符
Kotlin提供了4個訪問控制符:private、internal、protected和public,分別代表4個訪問控制級別:
- private:private成員只能在該類的內部或文件的內部被訪問。
- internal:internal成員可以在該類的內部或文件的內部或者同一個模塊內被訪問。
- protected:protected成員可以在該類的內部或文件的內部或者其子類中被訪問。
- public:public成員可以在任意地方被訪問。
如果Kotlin沒有顯式指定修飾符的話,默認的訪問控制修飾符是public。
3.1、Kotlin的訪問控制修飾符與Java的區別有如下幾點
- Kotlin取消了Java的默認訪問權限,引入了internal訪問控制符(模塊訪問權限)。
- Kotlin取消了protected的包訪問權限。
- Kotlin的默認訪問控制符是public。
模塊是編譯在一起的一套Kotlin文件,模塊的存在形式如下:
- 一個IntelliJ IDEA模塊
- 一個Maven項目
- 一個Gradle源集
- 一次<kotlinc>的Ant任務執行所編譯的一套文件
3.2、Kotlin不同作用域中的成員可支持的訪問控制符。
1、位於包內的頂層成員
位於包內的頂層成員,只能使用private、internal和public其中之一,不能使用protected修飾符。
- 使用private修飾,這些頂層成員只能在當前文件中被訪問。
- 使用internal修飾,這些頂層成員只能在當前文件或當前模塊中被訪問。
- 不加修飾符或使用public修飾,這些頂層成員可以在任意地方被訪問。
2、位於類、接口之內的成員
對於位於類、接口之內的成員,能使用private、internal、protected和public其中之一。
- 使用private修飾,這些成員只能在該類中被訪問。
- 使用internal修飾,這些成員能在該類或當前模塊中被訪問。
- 使用protected修飾,這些成員在該類或該類的子類中被訪問。
- 不加修飾符或使用public修飾,這些承壓UN可以在任意地方被訪問。
類的主構造器在類頭部分聲明。如果需要爲主構造器指定訪問權限修飾符,則一定要使用constructor關鍵字,並在該關鍵字前面添加private、internal、protected和public其中之一。
主構造器默認的訪問權限修飾符是public。
局部聲明的作用域僅在該方法內有效,使用訪問控制符沒有任何意義,所以不能使用private、internal、protected、public修飾符。
今年年初我花一個月的時間收錄整理了一套知識體系,如果有想法深入的系統化的去學習的,可以私信我【安卓】,我會把我收錄整理的資料都送給大家,幫助大家更快的進階。