Kotlin定義其他類(lèi)的實(shí)現(xiàn)詳解
1.嵌套類(lèi)
如果一個(gè)類(lèi)只對(duì)另外一個(gè)類(lèi)有作用,那么可以將其嵌入到該類(lèi)中,使兩個(gè)類(lèi)在一起。和Java中定義的內(nèi)部類(lèi)很像。
class Computer { class Mouse(val name:String){ fun showDescribe(){ println("mouse name is $name") } } } fun main() { val mouse = Computer.Mouse("Logitech") //可以通過(guò)嵌套類(lèi)的實(shí)例,訪問(wèn)其定義的屬性和函數(shù) mouse.showDescribe() println(mouse.name) }
2.數(shù)據(jù)類(lèi)
顧名思義,數(shù)據(jù)類(lèi)是專(zhuān)門(mén)用來(lái)存儲(chǔ)數(shù)據(jù)的。
1)數(shù)據(jù)類(lèi)的聲明,通過(guò)在class前加data修飾,就可以將一個(gè)普通類(lèi)定義為一個(gè)數(shù)據(jù)類(lèi)。
2)數(shù)據(jù)類(lèi)提供了toString,equals和hashCode的自定義實(shí)現(xiàn)。
3)==默認(rèn)比較的是對(duì)象的引用。但是==用來(lái)比較數(shù)據(jù)類(lèi),比較的是他們的內(nèi)容。
4)數(shù)據(jù)類(lèi)默認(rèn)支持解構(gòu)。因?yàn)閗otlin編譯器實(shí)現(xiàn)了解構(gòu)聲明。
//用data關(guān)鍵字修飾class,就可以定義一個(gè)數(shù)據(jù)類(lèi) data class MotionEvent(var x: Int, var y: Int) { } fun main() { //打印數(shù)據(jù)類(lèi)對(duì)象,默認(rèn)會(huì)調(diào)用toString方法。 val e1 = MotionEvent(10, 10) val e2 = MotionEvent(10, 10) println(e1) println(e1.toString()) //數(shù)據(jù)類(lèi)的==是判斷的equals方法,比較的是內(nèi)容,而不是對(duì)象引用。 println(e1 == e2) //數(shù)據(jù)類(lèi)支持解構(gòu) val (x, y) = e1 println("$x,$y") }
打印結(jié)果:
10
MotionEvent(x=10, y=10)
MotionEvent(x=10, y=10)
true
10,10
通過(guò)反編,看下kotlin對(duì)數(shù)據(jù)類(lèi)的默認(rèn)實(shí)現(xiàn)。
public final class MotionEvent { private int x; private int y; public final int getX() { return this.x; } public final void setX(int var1) { this.x = var1; } public final int getY() { return this.y; } public final void setY(int var1) { this.y = var1; } public MotionEvent(int x, int y) { this.x = x; this.y = y; } //解構(gòu)聲明 public final int component1() { return this.x; } //解構(gòu)聲明 public final int component2() { return this.y; } //默認(rèn)實(shí)現(xiàn)了toString public String toString() { return "MotionEvent(x=" + this.x + ", y=" + this.y + ")"; } //默認(rèn)實(shí)現(xiàn)了hashCode public int hashCode() { return Integer.hashCode(this.x) * 31 + Integer.hashCode(this.y); } //默認(rèn)實(shí)現(xiàn)了equals方法,比較的是兩個(gè)對(duì)象數(shù)據(jù)的值。 public boolean equals(@Nullable Object var1) { if (this != var1) { if (var1 instanceof MotionEvent) { MotionEvent var2 = (MotionEvent)var1; if (this.x == var2.x && this.y == var2.y) { return true; } } return false; } else { return true; } } }
3.定義數(shù)據(jù)類(lèi)的必須滿足的條件
1)數(shù)據(jù)類(lèi)必須至少有一個(gè)參數(shù)的主構(gòu)造函數(shù)。
2)數(shù)據(jù)類(lèi)的主構(gòu)造函數(shù)定義的參數(shù)必須是val或var修飾。
3)數(shù)據(jù)類(lèi)用data關(guān)鍵字修飾,但是不能使用abstract、open、sealed、inner修飾。
4.解構(gòu)聲明
解構(gòu)聲明的實(shí)現(xiàn)原理,就是聲明Component1、Component2等若干個(gè)組件函數(shù),讓每個(gè)函數(shù)返回一個(gè)熟悉數(shù)據(jù)。如果定義的是一個(gè)數(shù)據(jù)類(lèi),kotlin編譯器會(huì)自動(dòng)為每個(gè)屬性聲明Component函數(shù)。
自定義解構(gòu)聲明:
通過(guò)operator fun component1() 。從定義可以看出來(lái)解構(gòu)聲明,是一種特殊的函數(shù)。
class Student(val name: String,val age:Int){ operator fun component1() = name operator fun component2() = age } fun main() { val student = Student("HanMei",18) val (name: String, age: kotlin.Int) = student println("$name,$age") }
5.枚舉類(lèi)enum class
其實(shí)枚舉就是一個(gè)類(lèi),kotlin定義的枚舉用enum class,來(lái)強(qiáng)調(diào)枚舉也是一個(gè)類(lèi)。而java中只用enum修飾,就可以定義一個(gè)類(lèi)。所以,在java中,枚舉是一個(gè)類(lèi)的概念就不太深入。
enum class Week() { SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY; fun getDay(): String { return when (this) { SUNDAY -> "星期天" MONDAY -> "星期一" TUESDAY -> "星期二" WEDNESDAY -> "星期三" THURSDAY -> "星期四" FRIDAY -> "星期五" SATURDAY -> "星期六" } } } fun main() { println(Week.SUNDAY) println(Week.SUNDAY.getDay()) }
6.運(yùn)算符重載
可以通過(guò)operator fun plus 對(duì)“+”運(yùn)算符進(jìn)行重載。
data class MotionEvent(var x: Int, var y: Int) { operator fun plus(e1: MotionEvent) = MotionEvent(x + e1.x, y + e1.y) } fun main() { val e1 = MotionEvent(10, 10) val e2 = MotionEvent(10, 10) println(e1+e2) }
打印結(jié)果:
MotionEvent(x=20, y=20)
到此這篇關(guān)于Kotlin定義其他類(lèi)的實(shí)現(xiàn)詳解的文章就介紹到這了,更多相關(guān)Kotlin定義其他類(lèi)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android實(shí)現(xiàn)帶數(shù)字的圓形進(jìn)度條(自定義進(jìn)度條)
在項(xiàng)目開(kāi)發(fā)中經(jīng)常遇到帶圓形進(jìn)度條的需求,在GitHub上逛了一圈,發(fā)現(xiàn)沒(méi)有,今天小編抽空給大家分享Android實(shí)現(xiàn)帶數(shù)字的圓形進(jìn)度條(自定義進(jìn)度條),需要的朋友參考下2017-02-02Android RecycleView實(shí)現(xiàn)Item拖拽效果
RecyclerView是Android一個(gè)更強(qiáng)大的控件,其不僅可以實(shí)現(xiàn)和ListView同樣的效果,還有優(yōu)化了ListView中的各種不足。本文將介紹通過(guò)RecyclerView實(shí)現(xiàn)Item拖拽效果以及拖拽位置保存,感興趣的可以參考一下2022-01-01SQLiteStudio優(yōu)雅調(diào)試Android手機(jī)數(shù)據(jù)庫(kù)Sqlite(推薦)
這篇文章主要介紹了SQLiteStudio優(yōu)雅調(diào)試Android手機(jī)數(shù)據(jù)庫(kù)Sqlite的相關(guān)資料,需要的朋友可以參考下2017-11-11實(shí)例講解Android App使用自帶的SQLite數(shù)據(jù)庫(kù)的基本方法
這篇文章主要介紹了Android App使用自帶的SQLite數(shù)據(jù)庫(kù)的基本方法,SQLite是一個(gè)小巧的內(nèi)嵌型數(shù)據(jù)庫(kù),在數(shù)據(jù)庫(kù)需求不大的情況下使用SQLite其實(shí)非常有效,需要的朋友可以參考下2016-04-04快速了解Android?Room使用細(xì)則進(jìn)階
這篇文章主要為大家介紹了快速了解Android?Room使用細(xì)則進(jìn)階,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03淺析Android手機(jī)衛(wèi)士手機(jī)定位的原理
手機(jī)定位的三種方式:網(wǎng)絡(luò)定位,基站定位,GPS定位。本文給大家介紹Android手機(jī)衛(wèi)士手機(jī)定位的原理,感興趣的朋友一起學(xué)習(xí)吧2016-04-04activitygroup 切換動(dòng)畫(huà)效果如何實(shí)現(xiàn)
本文將詳細(xì)介紹activitygroup 切換動(dòng)畫(huà)效果實(shí)現(xiàn)過(guò)程,需要聊解的朋友可以參考下2012-12-12