今天的學習目錄
【函數的基本用法】
Kotlin聲明方式
先跟Java的聲明方式對比一下,從onCreate方法入手看看他們的不同
//Java 聲明方式
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {.....}
//Kotlin 聲明方式
override fun onCreate(savedInstanceState: Bundle?) {......}
通過兩者的對比,咱們可以發現
① Java使用@Override表示該函數重載父類的方法,而Kotlin使用小寫的override 在同一行表達重載操作
② Java 使用 protected / public 表示該函數爲公共方法,而Kotlin默認就表示函數是公開的,所以省略了關鍵字
③ Java使用 void表示該函數沒有返回值,而Kotlin中沒有關鍵字void ,若沒有返回值不用特別聲明
④ Kotlin 新增了關鍵字 fun,這個fun類似Java中 關鍵字class
⑤ Java聲明輸入參數格式 “變量 變量名稱”而Kotlin 前面說過參數的命名 “變量名稱:變量類型”
⑥ Kotlin 中引用了空安全機制,允許某個變量爲空,就需要在變量類型後面加個“?”
【輸入輸出參數的變化】
輸入參數的格式
舉幾個例子
//沒有輸入也沒有輸出函數
fun getDinner(){
tv_text.text = "動物園"
}
//只有輸入參數
fun getDinnerInput(egg:Int,leek:Double,water:String){
tv_text.text = water
}
輸出參數的格式
舉個栗子
//Unit類型表示表示沒有返回值 也可以直接省略Unit聲明
fun getDinnerUnit():Unit{
tv_text.text = "哦哦"
}
//只有輸出參數
fun getDinnerOutput():String{
var dinner:String = "奧利給!"
return dinner
}
//同時具備輸入輸出
fun getDinnerFull(egg: Int,water: String):String{
return water
}
默認參數
Kotlin 可以帶有默認參數
fun getDefault(general: String, first: String = "快", two: String = "準狠"): String {
var answer: String = "$general:$first,$two"
return answer
}
可變參數
默認參數的命名告一段落,如果函數定義裏面的參數可變,這該怎麼辦呢?在Java體系中,可變參數可以採用“Object…args”的形式。但是在Kotlin中新增了關鍵字vararg,表示其後面的參數個數不確定。
以可變的字符串爲例 Java寫法“String…args”,而Kotlin中的寫法“vararg args:Sting?”,函數內部解析的時候,Kotlin會把可變參數當成一個數組。
【幾種特殊的函數】
泛型函數
按照之前的例子,函數的輸入參數類型必須定義函數的時候需要指定
例如:var int_array:Array<Int> = arrayOf<Int>(1,2,3)
定義泛型函數的時候,得在函數名稱前面添加,以T聲明的參數 包括輸入輸出參數,參數必須在函數調用時指定。
fun <T> appendString(tag: String, vararg otherInfo: T?): String {
var str: String = "$tag:"
for (item in otherInfo) {
str = "$str${item.toString()}"
}
return str
}
調用appendString函數,就跟調用arrayOf方法一樣,只需在函數名稱後面加<變量類型>即可
內聯函數
前面我們定義的泛型函數appendString時,是把它作爲一個全局函數,也就是在類外定義,而不是在類內部定義。因爲類的成員依賴於類,只有泛型類才能擁有成員泛型函數,而普通類是不允許定義泛型函數的,否則編譯器直接報錯。 不過也有例外當參數類都是繼承於某種類型,那麼允許在定義函數時指定從這個基類泛化開,凡是繼承自該基類子類,都可以作爲輸入參數進行調用,反之無法調用!
舉個栗子,Int Float Double 都繼承自Number類,但是假如定義一個參數形式爲setArrayNumber(array:Array<Number>)的函數,它並不接受Array<Int>或者Array<Double>的入參。如果要讓該方法同事接收整型和雙精度的數組入參,那就得使用泛型T 來自於基類Number 將< T >改爲< reified T: Number>,同時在fun前面加上關鍵字inline,表示該函數屬於內聯函數。
//該函數不接收Array<Int>也不接收Array<Double>
fun setArrayNumber(array: Array<Number>) {
var str: String = "數組元素依次排列"
for (item in array) {
str = str + item.toString() + ","
}
}
//只有內聯函數才能可以被具體化
inline fun <reified T : Number> setArratStr(array: Array<T>) {
var str: String = "數組元素依次排列"
for (item in array){
str = str + item.toString() + ","
}
}
小結
通過這次學習應該要掌握的技能
(1) 學會定義一個包括輸入參數 輸出參數在內的完整函數形態
(2) 學會輸入參數的幾種定義,默認參數 名命參數
(3) 學會幾種函數定義以及使用