Kotlin學習之路(4)函數的運用

今天的學習目錄
在這裏插入圖片描述

【函數的基本用法】

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) 學會幾種函數定義以及使用

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章