【函数的基本用法】
Kotlin声明方式 先跟Java的声明方式对比一下,从onCreate方法入手看看他们的不同
代码语言:javascript复制//Java 声明方式
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
.....}
代码语言:javascript复制//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 中引用了空安全机制,允许某个变量为空,就需要在变量类型后面加个“?”
【输入输出参数的变化】
输入参数的格式
举几个例子
代码语言:javascript复制 //没有输入也没有输出函数
fun getDinner(){
tv_text.text = "动物园"
}
代码语言:javascript复制 //只有输入参数
fun getDinnerInput(egg:Int,leek:Double,water:String){
tv_text.text = water
}
输出参数的格式
举个栗子
代码语言:javascript复制 //Unit类型表示表示没有返回值 也可以直接省略Unit声明
fun getDinnerUnit():Unit{
tv_text.text = "哦哦"
}
代码语言:javascript复制 //只有输出参数
fun getDinnerOutput():String{
var dinner:String = "奥利给!"
return dinner
}
代码语言:javascript复制 //同时具备输入输出
fun getDinnerFull(egg: Int,water: String):String{
return water
}
默认参数
Kotlin 可以带有默认参数
代码语言:javascript复制 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,表示该函数属于内联函数。
代码语言:javascript复制 //该函数不接收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) 学会几种函数定义以及使用
[希望这篇文章可以帮到你]