Kotlin定義其他類的實現(xiàn)詳解
1.嵌套類
如果一個類只對另外一個類有作用,那么可以將其嵌入到該類中,使兩個類在一起。和Java中定義的內(nèi)部類很像。
class Computer {
class Mouse(val name:String){
fun showDescribe(){
println("mouse name is $name")
}
}
}
fun main() {
val mouse = Computer.Mouse("Logitech")
//可以通過嵌套類的實例,訪問其定義的屬性和函數(shù)
mouse.showDescribe()
println(mouse.name)
}2.數(shù)據(jù)類
顧名思義,數(shù)據(jù)類是專門用來存儲數(shù)據(jù)的。
1)數(shù)據(jù)類的聲明,通過在class前加data修飾,就可以將一個普通類定義為一個數(shù)據(jù)類。
2)數(shù)據(jù)類提供了toString,equals和hashCode的自定義實現(xiàn)。
3)==默認(rèn)比較的是對象的引用。但是==用來比較數(shù)據(jù)類,比較的是他們的內(nèi)容。
4)數(shù)據(jù)類默認(rèn)支持解構(gòu)。因為kotlin編譯器實現(xiàn)了解構(gòu)聲明。
//用data關(guān)鍵字修飾class,就可以定義一個數(shù)據(jù)類
data class MotionEvent(var x: Int, var y: Int) {
}
fun main() {
//打印數(shù)據(jù)類對象,默認(rèn)會調(diào)用toString方法。
val e1 = MotionEvent(10, 10)
val e2 = MotionEvent(10, 10)
println(e1)
println(e1.toString())
//數(shù)據(jù)類的==是判斷的equals方法,比較的是內(nèi)容,而不是對象引用。
println(e1 == e2)
//數(shù)據(jù)類支持解構(gòu)
val (x, y) = e1
println("$x,$y")
}打印結(jié)果:
10
MotionEvent(x=10, y=10)
MotionEvent(x=10, y=10)
true
10,10
通過反編,看下kotlin對數(shù)據(jù)類的默認(rèn)實現(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)實現(xiàn)了toString
public String toString() {
return "MotionEvent(x=" + this.x + ", y=" + this.y + ")";
}
//默認(rèn)實現(xiàn)了hashCode
public int hashCode() {
return Integer.hashCode(this.x) * 31 + Integer.hashCode(this.y);
}
//默認(rèn)實現(xiàn)了equals方法,比較的是兩個對象數(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ù)類的必須滿足的條件
1)數(shù)據(jù)類必須至少有一個參數(shù)的主構(gòu)造函數(shù)。
2)數(shù)據(jù)類的主構(gòu)造函數(shù)定義的參數(shù)必須是val或var修飾。
3)數(shù)據(jù)類用data關(guān)鍵字修飾,但是不能使用abstract、open、sealed、inner修飾。
4.解構(gòu)聲明
解構(gòu)聲明的實現(xiàn)原理,就是聲明Component1、Component2等若干個組件函數(shù),讓每個函數(shù)返回一個熟悉數(shù)據(jù)。如果定義的是一個數(shù)據(jù)類,kotlin編譯器會自動為每個屬性聲明Component函數(shù)。
自定義解構(gòu)聲明:
通過operator fun component1() 。從定義可以看出來解構(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.枚舉類enum class
其實枚舉就是一個類,kotlin定義的枚舉用enum class,來強調(diào)枚舉也是一個類。而java中只用enum修飾,就可以定義一個類。所以,在java中,枚舉是一個類的概念就不太深入。
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.運算符重載
可以通過operator fun plus 對“+”運算符進行重載。
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定義其他類的實現(xiàn)詳解的文章就介紹到這了,更多相關(guān)Kotlin定義其他類內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android實現(xiàn)帶數(shù)字的圓形進度條(自定義進度條)
在項目開發(fā)中經(jīng)常遇到帶圓形進度條的需求,在GitHub上逛了一圈,發(fā)現(xiàn)沒有,今天小編抽空給大家分享Android實現(xiàn)帶數(shù)字的圓形進度條(自定義進度條),需要的朋友參考下2017-02-02
Android RecycleView實現(xiàn)Item拖拽效果
RecyclerView是Android一個更強大的控件,其不僅可以實現(xiàn)和ListView同樣的效果,還有優(yōu)化了ListView中的各種不足。本文將介紹通過RecyclerView實現(xiàn)Item拖拽效果以及拖拽位置保存,感興趣的可以參考一下2022-01-01
SQLiteStudio優(yōu)雅調(diào)試Android手機數(shù)據(jù)庫Sqlite(推薦)
這篇文章主要介紹了SQLiteStudio優(yōu)雅調(diào)試Android手機數(shù)據(jù)庫Sqlite的相關(guān)資料,需要的朋友可以參考下2017-11-11
實例講解Android App使用自帶的SQLite數(shù)據(jù)庫的基本方法
這篇文章主要介紹了Android App使用自帶的SQLite數(shù)據(jù)庫的基本方法,SQLite是一個小巧的內(nèi)嵌型數(shù)據(jù)庫,在數(shù)據(jù)庫需求不大的情況下使用SQLite其實非常有效,需要的朋友可以參考下2016-04-04
activitygroup 切換動畫效果如何實現(xiàn)
本文將詳細(xì)介紹activitygroup 切換動畫效果實現(xiàn)過程,需要聊解的朋友可以參考下2012-12-12

