1.函数的基本用法
(1)java和kotlin的区别
| 区别 | java | kotlin |
|---|---|---|
| 书写形式 | @Overridepublic void onCreate(Bundle savedInstanceState) {} | override fun onCreate(savedInstanceState: Bundle?) {} |
| Override | “@Override”表示该函数是重载了父类的方法 | 小写的“override”在同一行表达重载操作 |
| public | 表示该函数是公共方法 | 默认函数就是公开的,所以省略了关键字“public” |
| void | 表示该函数没有返回参数 | 不存在关键字“void”,若无返回参数则不用特别说明 |
| fun | java中没有fun | 表示函数的定义,类似java中的class |
| 参数格式 | 对象类型 对象名称 | 对象名称: 对象类型 |
| 安全机制 | Kotlin引入了空安全机制,如果某个对象允许为空的话,需要在对象类型后面加个问号“?” |
-
函数声明基本格式:
fun 函数名 ():返回值类型{函数体}
fun 函数名 (参数:参数类型){函数体}
fun 函数名 (参数:参数类型):返回值类型{函数体}
-
函数简化
fun 函数名 (参数1:参数类型,参数2:参数类型):返回值类型{函数体}
简化后:fun 函数名 (参数1:参数类型,参数2:参数类型):返回值类型=参数1+参数2(类型一致)
举例:
//原函数:
fun sum(a:Int , b:Int):Int{
return a+b
}
//简化后
fun sum(a:Int , b:Int):Int=a+b
-
使用var声明函数
kotlin中除了使用fun声明函数外也可以使用var
举例1
var i={x:Int , y:Int -> x+y} //声明函数i,接收两个Int类型参数 x、y,返回 x+y 的值
i(3,5) //调用使用 var 声明的函数 i
举例2
var j:(Int,Int)->Int={x,y -> x+y} //声明函数j,它接收的参数是两个Int, 返回一个Int,对应的表达式是 {x,y->x+y}
j(4,4) //调用函数
注意:
如果没有返回值,使用 :Unit 标识,也可以省略不写
返回值也是使用 return 返回。
(2)输入参数的变化
-
具有默认值的函数声明
举例
val Pi=3.1415926
fun getRoundArea(PI:Float=Pi , radius:Float):Float{ //为变量PI赋予了默认值 Pi,这样,调用该方法时可以不再传递PI。但,如果我们想传入的值和默认值不一致时还是需要传入的
return PI*radius*radius
}
- 调用带有默认参数值的函数
var a=getRoundArea(3.14f,5.0f) //因为我们相传入的PI和默认值不一致,所以,需要将3.14f传入
-
具名参数的使用
所谓具名参数,就是调用某个方法时指定传入参数给那个变量
var a=getRoundArea(radius=5.0f) //我们需要的PI值与默认值一致,此时不需要再传入PI值。只需要通过 radius=5.0f 声明我们传入了半径值
(3)参数长度可变的函数
关键字:vararg
定义:调用函数我们根据实际传入的参数个数由我们需求来定
举例:
fun varList(vararg vars: Int) { //关键在vararg
for (v in vars) { //遍历输入的内容
println(v)
}
}
2.特殊函数
(1)泛型函数
-
特点:
T代表泛型,定义泛型时需要在fun后面加T,然后要指明那个参数类型为T。
-
泛型函数的定义:
fun <T> appendStr(tag: String,vararg otherInfo: T):String{
var str:String="$tag:"
//遍历可变参数中的泛型常量,将其转化为字符串再拼接到一起
for (item in otherInfo){
str="$str${item.toString()},"
}
return str
}
注意:Kotlin允许定义全局函数,即函数可放在单独的kt文件中定义,且其他地方也能直接调用
- 泛型函数的使用:
R.id.btn_vararg_generic -> {
//泛型函数
tv_four_answer.text=when(count++%3){
0-> appendStr("泛型函数","string类型","举例一")
1-> appendStr("泛型函数int类型",1,2,3)
else -> appendStr("泛型函数double类型",1.2,1.3)
}
}
(2)内联函数
(3)简化函数
函数内容比较简单化,可以放在一行。
阶乘:
fun factorial(n:Int):Int =if (n<=1) n else n* factorial(n-1)
(4)尾递归函数
-
特点:
函数结尾调用函数自身,比如阶乘
fun 前面添加 tailrec
尾递归函数会使用循环的方式替代递归,从而避免栈溢出。
- 举例:
tailrec fun findFixPoint(x:Double=1.0):Double
=if (x==Math.cos(x)) x else findFixPoint(Math.cos(x))
(5)高阶函数
把A函数作为B函数的输入参数,此时,B函数就被称为高阶函数,A 函数则被称为函数类型的变量。
后续添加
(6)增强系统函数
1.扩展函数
- 常用的扩展函数格式:
//要扩展哪个类中的方法,被扩展的类名就是哪个
fun 被扩展的类名.扩展函数名(..参数..){
函数体
}
举例:
fun Array<Int>.swap(pos1: Int, pos2: Int) {
函数体
}
- 带泛型的扩展函数格式:
fun <T> Array<T>.swap(pos1: Int, pos2: Int) {
函数体
}
2.扩展高阶函数
3.单例对象
使用object修饰类,替代class,类似java中的static class ,外部可以不需要构造对象就可以直接调用其中的属性和函数
3、构造函数constructor
kotlin里面的构造函数分为主构造函数和次构造函数。主构造函数只能有一个,次构造函数个数不限制,可以有一个或者多个。
(1).主要构造函数
//主构造方法如下,跟在类名后面
class Demo constructor(name:String){
}
class Democonstructor(){
}
//当主构造方法没有任何注解或者可见性修饰符时,可以省略,写成下面这样
class Demo{
}
//这种就是有注解标记的主构造方法,不能省略
class Demo @Inject internal constructor(){
}
(2).次要构造函数
//次构造方法,一个无参的次构造方法,一个有一个参数的次构造方法
class Person {
constructor(){
}
constructor(name:String){
}
}
(3).注意点
不管是什么构造方法,先执行init模块逻辑,后执行构造方法的逻辑