Android?Kotlin全面詳細(xì)類使用語(yǔ)法學(xué)習(xí)指南
前言
Kotlin被Google官方認(rèn)為是Android開(kāi)發(fā)的一級(jí)編程語(yǔ)言
今天,我將主要講解kotlin中的類的所有知識(shí),主要內(nèi)容包括如下:
1. 類的聲明 & 實(shí)例化
// 格式 class 類名(參數(shù)名1:參數(shù)類型,參數(shù)名2:參數(shù)類型...){ // to do } // 示例 class User(userName: String, age: Int){ // to do } // 實(shí)例化 // Kotlin沒(méi)有new關(guān)鍵字,所以直接創(chuàng)建類的實(shí)例(無(wú)參情況 & 有參): var user = User() var user = User("ABC" , 123) // 額外說(shuō)明:Kotlin支持默認(rèn)參數(shù) // 即在調(diào)用函數(shù)時(shí)可不指定參數(shù),則使用默認(rèn)函數(shù) class User(userName: String = "hjc", age: Int = 26){ // to do } // 在實(shí)例化類時(shí)不傳入?yún)?shù),userName默認(rèn) = hjc,age默認(rèn) = 26 var user = User() // 在設(shè)置默認(rèn)值后,若不想用默認(rèn)值可在創(chuàng)建實(shí)例時(shí)傳入?yún)?shù) var user = User("ABC" , 123) // 注:命名參數(shù) 若一個(gè)默認(rèn)參數(shù)在一個(gè)無(wú)默認(rèn)值的參數(shù)前,那么該默認(rèn)值只能通過(guò)使用命名參數(shù)調(diào)用該函數(shù)來(lái)使用 class User(userName: String = "hjc", age: Int){ // to do } var user = User(age = 26)
對(duì)于構(gòu)造函數(shù),Kotlin中類可有一個(gè)主構(gòu)造函數(shù) & 多個(gè)次構(gòu)造函數(shù),下面將詳細(xì)說(shuō)明。
2. 構(gòu)造函數(shù)
2.1 主構(gòu)造函數(shù)
- 屬于類頭的一部分 = 跟在類名后,采用 constructor 關(guān)鍵字
- 不能包含任何的代碼。初始化的代碼放到以 init 關(guān)鍵字作為前綴的代碼塊中
class 類名 constructor(參數(shù)名:參數(shù)類型){ init { //... } } // 示例 class User constructor(userName: String) { init { //... } } // 注:若主構(gòu)造函數(shù)無(wú)任何注解 / 可見(jiàn)性修飾符,可省略 constructor 關(guān)鍵字 class 類名(參數(shù)名:參數(shù)類型){ init { //... } } // 示例 class User (userName: String) { init { //... } }
2.2 次構(gòu)造函數(shù)
- 必須加constructor關(guān)鍵字
- 一個(gè)類中可存在多個(gè)次構(gòu)造函數(shù),傳入?yún)?shù)不同
// 形式 constructor(參數(shù)名:參數(shù)類型) :{函數(shù)體} // 示例 class User(userName: String) { // 主構(gòu)造函數(shù) init { println(userName) } // 次構(gòu)造函數(shù)1:可通過(guò)this調(diào)主構(gòu)造函數(shù) constructor() : this("hjc") // 次構(gòu)造函數(shù)2:可通過(guò)this調(diào)主構(gòu)造函數(shù) constructor(age: Int) : this("hjc") { println(age) } // 次構(gòu)造函數(shù)3:通過(guò)this調(diào)主構(gòu)造函數(shù) constructor(sex: String, age: Int) : this("hjc") { println("$sex$age") } } // 實(shí)例化類 User("hjc") // 調(diào)用主構(gòu)造函數(shù) User() // 調(diào)用次構(gòu)造函數(shù)1 User(2) // 調(diào)用次構(gòu)造函數(shù)2 User("male",26) // 調(diào)用次構(gòu)造函數(shù)3
3. 類的屬性
Kotlin的類可以擁有屬性:關(guān)鍵字var(讀寫(xiě)) / 關(guān)鍵字val(只讀)
class User { var userName: String val sex: String = "男" } // 使用屬性 = 名稱 + 引用 User().sex // 使用該屬性 = Java的getter方法 User().userName = "hjc" // 設(shè)置該屬性 = Java的setter方法
4. 可見(jiàn)性修飾符
5. 繼承 & 重寫(xiě)
- 類似于Java,Kotlin是單繼承 = 只有一個(gè)父類
- 區(qū)別:Kotlin使用冒號(hào)“ : ”繼承 & 默認(rèn)不允許繼承(若想讓類可被繼承,需用open關(guān)鍵字來(lái)標(biāo)識(shí))
// 用open關(guān)鍵字標(biāo)識(shí)該類允許被繼承 open class Food // 類Fruits繼承類Food class Fruits : Food()
- 對(duì)于子類重寫(xiě)父類的方法,在Kotlin中,方法也是默認(rèn)不可重寫(xiě)的
- 若子類要重寫(xiě)父類中的方法,則需在父類的方法前面加open關(guān)鍵字,然后在子類重寫(xiě)的方法前加override關(guān)鍵字
// 父類 // 在類 & 方法前都加了關(guān)鍵字open,為了被繼承 & 方法重寫(xiě) open class Food { open fun banana() {} } // 子類 class Fruits : Food(){ // 重寫(xiě)了父類的方法 override fun banana() { super.banana() } }
6. 特殊類
下面將講解一些特殊的類:
- 嵌套類(內(nèi)部類)
- 接口
- 數(shù)據(jù)類
- 枚舉類
6.1 嵌套類(內(nèi)部類)
/** * 1. 嵌套類(內(nèi)部類) * 標(biāo)識(shí):關(guān)鍵字inner * 使用:通過(guò)外部類的實(shí)例調(diào)用嵌套類 */ class User { var age: Int = 0 inner class UserName { } } var userName: User.UserName = User().UserName()
6.2 接口
/** * 2. 接口 * 標(biāo)識(shí):關(guān)鍵字interface */ // 聲明 interface A{} interface B{} // 方法體 // 接口中的方法可以有默認(rèn)方法體,有默認(rèn)方法體的方法可不重寫(xiě) // 區(qū)別于Java:Java不支持接口里的方法有方法體。 interface UserImpl{ fun getName(): String // 無(wú)默認(rèn)方法體,必須重寫(xiě) fun getAge(): Int{ // 有默認(rèn)方法體,可不重寫(xiě) return 22 } } // 實(shí)現(xiàn)接口UserImpl:需重寫(xiě)getName() & 可不重寫(xiě)getAge() class User :UserImpl{ override fun getName(): String { return "hjc" } } // 實(shí)現(xiàn)接口:冒號(hào): class Food : A, B {} // Kotlin是多實(shí)現(xiàn) class Fruits: Food,A, B {} // 繼承 + 實(shí)現(xiàn)接口
6.3 數(shù)據(jù)類
/** * 3. 數(shù)據(jù)類 * 作用:保存數(shù)據(jù) * 標(biāo)識(shí):關(guān)鍵字data */ // 使用:創(chuàng)建類時(shí)會(huì)自動(dòng)創(chuàng)建以下方法: // 1. getter/setter方法; // 2. equals() / hashCode() 對(duì); // 3. toString() :輸出"類名(參數(shù)+參數(shù)值)"; // 4. copy() 函數(shù):復(fù)制一個(gè)對(duì)象&改變它的一些屬性,但其余部分保持不變 // 示例: // 聲明1個(gè)數(shù)據(jù)類 data class User(var userName: String, var age: Int) // copy函數(shù)使用 var user = User("hjc",26) var user1 = user.copy(age = 30) // 輸出user1.toString(),結(jié)果是:User(userName=hjc,age=30) // 特別注意 // 1. 主構(gòu)造方法至少要有一個(gè)參數(shù),且參數(shù)必須標(biāo)記為val或var // 2. 數(shù)據(jù)類不能用open、abstract、sealed(封閉類)、inner標(biāo)識(shí)
6.4 枚舉類
/** * 4. 枚舉類 * 標(biāo)識(shí):關(guān)鍵字enum */ // 定義 enum class Color { RED, GREEN, BLUE } // 為枚舉類指定值 enum class Color(rgb: Int) { RED(0xFF0000), GREEN(0x00FF00), BLUE(0x0000FF) }
總結(jié)
本文全面介紹了Kotlin語(yǔ)法中的類,更多關(guān)于Android Kotlin類語(yǔ)法的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Android 開(kāi)發(fā)延時(shí)調(diào)用的幾種方法
本篇文章主要介紹Android 延遲, 在Android 程序開(kāi)發(fā)過(guò)程中經(jīng)常會(huì)遇到程序推遲時(shí)間執(zhí)行,這里整理了幾種方法,以便Android 開(kāi)發(fā)的朋友參考2016-07-07Core Animation一些Demo總結(jié) (動(dòng)態(tài)切換圖片、大轉(zhuǎn)盤(pán)、圖片折疊、進(jìn)度條等動(dòng)畫(huà)效果)
這篇文章主要介紹了Core Animation一些Demo總結(jié) (動(dòng)態(tài)切換圖片、大轉(zhuǎn)盤(pán)、圖片折疊、進(jìn)度條等動(dòng)畫(huà)效果)的相關(guān)資料,需要的朋友可以參考下2016-02-02Android開(kāi)發(fā)中的MVC設(shè)計(jì)模式淺析
這篇文章主要介紹了Android開(kāi)發(fā)中的MVC設(shè)計(jì)模式淺析,本文講解了對(duì)Android開(kāi)發(fā)中的MVC設(shè)計(jì)模式的理解,需要的朋友可以參考下2015-06-06Android使用setCustomTitle()方法自定義對(duì)話框標(biāo)題
Android有自帶的對(duì)話框標(biāo)題,但是不太美觀,如果要給彈出的對(duì)話框設(shè)置一個(gè)自定義的標(biāo)題,使用AlertDialog.Builder的setCustomTitle()方法非常方便,接下來(lái)通過(guò)本文給大家介紹Android使用setCustomTitle()方法自定義對(duì)話框標(biāo)題,感興趣的朋友一起學(xué)習(xí)吧2016-02-02ListView實(shí)現(xiàn)下拉刷新加載更多的實(shí)例代碼(直接拿來(lái)用)
這篇文章主要介紹了ListView實(shí)現(xiàn)下拉刷新加載更多的實(shí)例代碼(直接拿來(lái)用)的相關(guān)資料,需要的朋友可以參考下2016-07-07Android布局ConstraintLayout代碼修改約束及輔助功能
這篇文章主要為大家介紹了Android布局ConstraintLayout代碼修改約束及輔助功能示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09Android7.0版本影響開(kāi)發(fā)的改進(jìn)分析
這篇文章主要介紹了Android7.0版本影響開(kāi)發(fā)的改進(jìn),總結(jié)分析了Android7.0版本中比較常見(jiàn)的開(kāi)發(fā)注意事項(xiàng)與操作技巧,需要的朋友可以參考下2017-11-11