函數的聲明和使用
Kotlin中函數的聲明使用關鍵字 fun 格式爲:可見性修飾符 fun 函數名(參數名 :類型):返回值{}
例如:
fun main(){ }
- 上面的例子沒有可見性修飾符,因爲Kotlin中默認爲public
- 函數沒有返回值時可以省略
函數的作用範圍
1.成員函數
成員函數是指在類或對象中的內部函數 例如:
class Demo{ fun main(){} }
2.本地函數
本地函數允許把小函數聲明在其他函數內部,甚至可以多層嵌套
例如
fun printArea(w: Int,h: Int){ fun area(w: Int,h: Int){ return w * h } val area = area(w,h) print(area) }
area函數在printArea外部無效,它只服務於printArea。這在實現一個大函數時隱藏實現的細節是非常有用的。除此之外,本地函數還有一個好處就是可以訪問嵌套住函數中的變量,例如:
fun printArea(w: Int,h: Int){ fun area() = w * h val area = area(w,h) print(area) }
3.頂層函數
所謂頂層函數,即這些函數不屬於任何源碼文件的小集團(class,對象,interface),而是直接定義在源碼文件中的。他們在所有小集團的層級之上。 在定義通用性的工具欄和幫助類函數時非常有用,源碼的各個部分可能都需要用它。
命名參數和默認參數
1.命名參數
可以在調用函數時把參數的名字寫出來。好處是一旦參數衆多,調用時會看的比較清楚,代碼可讀性高。
例如:
fun printPerson(p: Person){ print(p.match(age = 20, name = "hankkin", nickname = "xxx", sex = "男", weight = "120")) }
當然在AS中,默認會顯示參數的hint,很方便了,所以一般很少用。
2.默認參數
在Kotlin中可以定義一個或者多個默認參數,在被調用時如果不指定,則使用默認值。
fun valueOf(unscaledVal: Int = 0,scale: Int,prec: Int = 1)
函數操作符
函數操作符用了一個符號來表示。Kotlin中的函數有很多內置的操作符。例如array[1],[1]就相當於數組的.get(1)方法
1.操作符重載
Kotlin允許爲預定義操作符提供自定義的實現。這些操作符具有固定符號表示(如+ - * /),固定的優先級precedence。有相應的成員函數member function或擴展函數extension function,重載操作符的函數必需要用operator修飾符標記
2.基礎操作符
操作 | 函數名 |
---|---|
!x | x.not() |
-y | y.unaryMinus() |
+z | z.unaryPlus() |
a…b | a…rangeTo(b) |
c + d | c.plus(d) |
e - f | e.minus(f) |
g * h | g.times(h) |
m % n | m.mod(n) |
i/j | i.div(j) |
函數擴展
1.擴展函數的優先級
擴展函數不能重載類或者接口中已經定義的函數。如果你定義了一個與既有函數一摸一樣的擴展函數,名字一樣,參數一樣,這個擴展時無效的。
2.擴展函數的作用範圍
通常我們用頂層函數做擴展,但也可以在類中做擴展
3.擴展函數在子類中的重載
子類中可以重載成員擴展函數,前提是這個類是open,即可重載的。在這種情況下,子類的函數接受者類型是由運行時的實例決定的,而擴展的接受者類型始終時編譯時就確定的,也就是靜態的
4.infix中綴函數
中綴函數跟賦值操作符有點像,不同的是名稱可以是任意的。例如Kotlin自帶的to函數,可以把兩個變量湊成一個二元祖。Kotlin中可以把成員函數定義成中綴。因爲中綴函數是二元的,必須有2個參數,第一個很顯然是實例,第二個是函數的參數