1. 程式人生 > >第六章 (一)函式.md

第六章 (一)函式.md

函式

1、函式定義

格式:

		fun 函式名(資料型別 形參1,....):返回值型別{


			......
		return...




		}
  1. 當沒有返回值時,直接省略掉":返回值型別"即可或者使用":Unit"宣告(Unit相當於Java中的void)代表沒有返回值

1.1、形參預設值

除了返回值寫法和Java中外,Kotlin中形參允許可以有預設值

針對以上具體函式為例:

	fun test(name:String="lelsie",age:Int):Person{

	。。。。。。。

	return ....

	}

當沒有返回值時:

fun test(name:String="lelsie",age:Int):Unit{

		。。。。。。。

		

		}

或者

fun test(name:String="lelsie",age:Int){

		。。。。。。。

		

		}

2、函式呼叫

java中方法呼叫時使用位置引數,即形參和實參一一對應,Kotlin除了使用java中這種傳統位置引數呼叫,還可以使用命名引數(“外部形引數名=值”)形式呼叫,甚至還可以使用這兩種混合方式

  1. 位置引數呼叫
  2. 命名引數呼叫
  3. 位置引數和命名引數混合呼叫(所有位置引數必須位於命名引數之前,即命名引數後都是命名引數了)

注意:

  1. 所有位置引數必須位於命名引數前,即第一個引數如果使用命名引數,那麼後面的引數如果要傳值(比如後面形參指定了預設值)也必須使用命名引數),特殊情況比如使用命名引數方式這個形參後形參都定義了預設值,呼叫時也使用預設值即不用傳任何值

外部形參:和方法定義的形參名一樣

內部形參:方法定義的形參名

fun testName(age:Int=10,name:String,studentNO:Int){

	Log.d("TAG","name=${name},age=${age}")

}

呼叫:testName(name = “leslie”,1)該種方式[第一個引數用命名引數方式,第二個引數不傳實參使用預設值,第三引數使用位置引數]即會報錯,上面我們說了位置引數必須在命名引數前,這裡第一個引數就用名引數方式,所以後面的形參也要賦值時就必須也以命名引數方式:比如:testName(name=“lelsie”,studentNo=12);

如果只使用位置引數呼叫,但是形參都有預設值情況:

fun testName(name:String=“leslie”,age:Int=10,studentNO:Int=12){

	Log.d("TAG","name=${name},age=${age}")

}

呼叫:testName(1)將報錯,因為預設是賦值給第一個引數的,而第一個引數是String型別

  1. 只傳一個值時,預設賦值給第一個形參
  2. 如果傳多個值且使用位置引數,那麼必須一個為每個形參傳值,否則就會報錯,但是這樣也就失去預設值的意義;因此如果要要傳多個值(但有不是為所有的值傳值),必須使用位置引數和命名引數混合的方式如:testName(“lin”,studentNO=20)

2.1、可變形參

形式:vararg 形參名:資料型別

首先,一個方法中最多隻能有一個可變形參,但和java中要求不同的是***可變形參可以位於形參任意位置,而不是隻能位於形參列表的最後位置***

當可變形參位於形參列表第一個時:後面的其他形參必須使用命名引數方式

fun vararg(vararg books:String,num:String){ for (book in books){ Log.d(“TAG”,book) }

可變引數實質就是一個數組,當將陣列元素傳給可變性參時,在陣列前新增"*"

3、單表示式函式

函式只返回單個表示式,可以省略{}並在“=”後指定函式體既可。表示式的值即為返回值

如:

	fun area(x:Double,y:Double):Double=x*y

4、函式過載

要求:

  1. 函式名相同
  2. 引數列表個數不同或者引數列表個數相同但是引數型別不同