日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

转向Kotlin——数据类和封闭类

發布時間:2025/3/8 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 转向Kotlin——数据类和封闭类 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

數據類和封閉類是Kotlin中的兩種特殊的類,今天一起了解一下。更多精彩內容也可以關注我的微信公眾號——Android機動車

數據類

數據類是Kotlin的一個語法糖。Kotlin編譯器會自動為數據類生成一些成員函數,以提高開發效率。

數據類的使用

無論是Java服務器開發還是Android開發,實體類自然是特別熟悉,它就是將Json格式轉化為一個只包含數據和基本操作方法的實體類,以方便網絡存取和數據庫存取。

我們總是需要一個類來表示數據,例如要表示一個用戶的數據,我們會創建一個User類,并通過構造器傳入兩個屬性:

class User(name: String, age: Int) {var mName = namevar mAge: Int = age } 復制代碼

我們定義實體類,除了要保存數據之外,還需要輸出對象的值,比較對象等操作,前者會用到toString函數,后者會用到equals函數,如下:

var user1 = User("js", 20) var user2 = User("lx", 12)println(user1) println(user2) println(user1.equals(user2)) 復制代碼

輸出結果是:

User@3764951d User@4b1210ee false 復制代碼

從結果可以看出,輸出User的兩個對象時,調用了這兩個對象的toString方法,但toString函數默認會調用hashcode函數,輸出當前對象的hashcode,并在前面加上 類名@

對象的equals方法默認也是比較了兩個對象的hashcode,兩個對象hashcode不同,自然返回false。

有時我們的業務需求是這樣的:打印對象,即按規則打印對象的所有屬性,兩個對象的所有屬性值相同,則返回兩個對象相等,于是乎我們需要重寫toString函數和equals函數,相信大家都會寫,這里就不再累贅了。

盡管前面寫的User類實現了我們的需求,但會不會也太麻煩了,每個類都需要重寫toString和equals等方法。為了提高開發效率,Kotlin加入了我們馬上要介紹的數據類。

所謂數據類,就是只定義必要的部分,其余部分可以自動生成。

從上面的類可以看出,只有name和age是必須的,其余的都是可以自動推導的。**數據類規定:屬性要通過主構造器指定,而且還要在class關鍵字之前加data。**我們再寫一個數據類,如下:

data class Person(var name: String, val age: Int) 復制代碼

可以看出,原本十幾行幾十行的代碼,現在一行就搞定了,其余的Kotlin編譯器會自動生成。

數據類也和普通類一樣,也可以繼承其他類,有一些其他的成員函數等。

編寫一個數據類需要注意:

  • 主構造器至少要有一個參數;
  • 主構造器的參數要用var或val修飾;
  • 數據類不能是抽象類、open類、封閉類或者內部類。

由于主構造器中必須至少要有一個參數,所以在數據類中,不可能存在無參的主構造器,要想讓數據類擁有一個無參的構造器,有以下兩種方法:

  • 為主構造器的每一個參數都加上默認值;
  • 添加一個沒有參數的次構造器,并調用主構造器同時指定各參數。
  • data class MPerson(var name: String = "js", var age: Int = 20)data class NPerson(var name: String, var age: Int) {// 次構造器,this調用主構造器,并指定參數constructor() : this("js", 20) } 復制代碼

    對象的復制

    在開發中,我們經常需要復制一個對象,然后修改它的一部分屬性,這就需要復制機制,Kotlin除了為數據類自動生成toString方法和equals方法,還默認生成了一個copy方法,它的作用就是復制數據類的實例。代碼如下:

    var person = Person("wj", 20) var mCopyPerson1 = person.copy() var mCopyPerson2 = person.copy(name = "js") 復制代碼

    數據類成員的解構

    所謂解構,就是解除結構,指的是將數據對象中的屬性提取出來,分別賦給單個變量。

    Kotlin編譯器會自動為數據類生成組件函數(以后會說到),因此,可以直接將數據類成員解構:

    var js = Person("Js", 20) // 將js.name和js.age分別賦給name和age變量 var (name, age) = js println("$name, is $age years old") 復制代碼

    封閉類

    封閉類可以看作是枚舉的擴展。一個封閉類,前面用sealed關鍵字標識??梢杂腥我舛鄠€子類和對象。封閉類的值只能是這些子類和對象。

    使用封閉類的好處是when表達式,不需要再使用else形式了。看個例子:

    sealed class Exprdata class Const(var count: Int) : Expr() data class Sun(var e1: Expr, var e2: Expr) : Expr()fun evel(expr: Expr): Int = when (expr) {is Const -> expr.countis Sun -> evel(expr.e1) + evel(expr.e2) } 復制代碼

    總結

    在Kotlin中提供了一些特殊的類,其中數據類和封閉類就是其中的兩個。盡管這些特殊的類并不是必須的,但有些時候使用它們會給我們的開發帶來很大的方便,尤其是數據類。

    更多精彩內容,歡迎關注我的微信公眾號——Android機動車

    總結

    以上是生活随笔為你收集整理的转向Kotlin——数据类和封闭类的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。