欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Kotlin定義其他類(lèi)的實(shí)現(xiàn)詳解

 更新時(shí)間:2022年09月05日 15:43:57   作者:niuyongzhi  
這篇文章主要介紹了Kotlin定義其他類(lèi)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

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)文章

最新評(píng)論