一、构造器
1、主构造器
写在类名之后的constructor()
class User constructor(name:String){
var username = name
}
类中的属性username可以引用构造函数中的参数name
可以在主构造器中直接声明属性
class User constructor(var name:String){
}
主构造器中的参数除了在类的属性中使用,还可以在 init 代码块中使用:
class User constructor(name:String){
var username = name
init {
println("username = $name")
}
}
init 代码块是紧跟在主构造器之后执行的,这是因为主构造器本身没有代码体,init 代码块就充当了主构造器代码体的功能。
通常情况下,主构造器中的 constructor 关键字可以省略,
有些场景, 是不可以省略的,例如:在主构造器上使用可见性修饰符或者注解
class User private constructor(var name:String){
}
2、次构造器
写在类中的constructor()
如果类中有主构造器,那么其他的次构造器都需要通过 this 关键字调用主构造器,直接调用或者间接调用
在使用次构造器创建对象时,init 代码块是先于次构造器执行的。
class User constructor(var name:String){
constructor(name:String,id:Int):this(name){
}
}
二、函数简化
1、函数体只有一行代码
fun add(a:Int,b:Int){
return a + b
}
可以这样写
fun add(a:Int,b:Int)=a + b
2、函数默认值
fun hello(name:String = "world") = println("hello $name")
hello()
hello("kotlin")
3、命名参数与位置参数
fun hello(name:String = "world",age:Int) = println("hello $name age = $age")
hello(10)
默认值的参数在无默认值参数的前面,IDE会报错:参数不匹配,这时需要用命名参数,显示指定参数名称
hello(age = 10)
如果函数中参数个数很多,可以按位置顺序进行赋值,这种称为位置参数