天天看點

kotlin學習筆記——類、函數、接口

Kotlin學習筆記系列:http://blog.csdn.net/column/details/16696.html

1、類 類是空的可以省略大括号, 如: class A(name: String) 注意:kotlin與java的一個不同點,代碼句結尾不必加“;”号

2、類繼承 預設是final的,是以隻能繼承那些明确聲明open或abstract的類。

3、函數 一切kotlin函數都會傳回一個值,如果沒有指定預設傳回一個Unit類 可以省略結尾分号 當傳回值用一個表達式即可計算出來,可以使用等号代替大括号,如:   fun add(x: Int, y: Int) Int = x + y

4、預設參數 為參數指定一個預設值,這樣這個參數就成了可選,如: fun toast(msg: String, length: Int = Toast.LENGTH_LONG){      ... } 使用時就可以不傳length這個參數,如: toast("test toast")

5、通過參數名傳參 假設函數:  fun toast(msg: String, tag: String = "default", length: Int = Toast.LENGTH_LONG) 可以這樣使用: toast(msg = "hello", length = 1000) 這樣可以忽略中間某個預設參數

6、執行個體化 執行個體化省略new關鍵字,如 var layoutManager = LinearLayoutManager(this)

7、伴随對象companion object 在kotlin中使用companion object來定義一些靜态屬性、常量和靜态函數,這個對象被這個類所有對象共享,類似java中的靜态變量和方法, 如:

class Circle(var r: Float){
     companion object{
          var pi = 3.14f
     }

     fun getLength(): Float{
          return 2 * pi * r
     }
}
           

8、接口 kotlin的接口與java接口不同之處在于kotlin的借口可以包含代碼,如:

interface TestInterface {

    var i : Int

    fun test(){
        i = 3
    }

    fun interfaceMethod()
}
           

可以看到在接口中可以定義變量和函數,而實作接口的子類可以直接使用變量和函數,如:

class TestInterfaceClass(override var i: Int) : TestInterface{
    override fun interfaceMethod() {
        test()
        i = 4
    }
}
           

9、别名 在java中,如果有兩個相同名稱的類,在同一個類中使用時,其中一個類需要使用完整包名。 在kotlin中,可以指定一個别名來避免使用完整包名,如:

import com.test.common.Product
import com.test.model.Product as ProdectModel
           

這樣在代碼中隻要使用ProductModel就可以了,如:

var productA = Product()
var productB = ProdectModel()
           

但是注意,有了别名的類就不能在該類中使用原有的類名了。

10、修飾符 在kotlin中預設的修飾符是public,節約了很多時間和字元。

kotlin中的修飾符有private\protected\internal\public 其中internal是整個module可見的,當然它依賴于所在領域的可見性(比如private類下的internal函數)。這裡的module就是android studio中的module概念,是指可以單獨編譯、運作、測試的獨立功能性子產品。

所有構造器預設都是public的,但是可以用下面的文法來修改可見性: class C private contructor(a: Int){ ... }

11、内部類 在kotlin中内部類如果是普通類,則無法通路外部類成員(類似java中的static靜态内部類),如

class ModelA{
     val a = 1
     class ModelB{
          val b = a
     }
}
           

上面的val b = a代碼就會報錯無法編譯。 如果想在内部類通路外部類成員,需要用inner修飾,如

class ModelA{
     val a = 1
     inner class ModelB{
          val b = a
     }
}
           

這樣就可以正常編譯運作。