Kotlin初級(三)- - - 基礎函式
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個引數,第一個很顯然是例項,第二個是函式的引數