扩展函数和属性可以定义在对应的类中和kotlin文件中;
1.扩展函数
1.扩展函数可以由对象直接调用,在扩展函数中,用this指代调用对象;
data class User(
@get:NotNull
var username:String,
var password:String? = null,
var createTime:Date? = null,
var updateTime:Date? = null
)
//扩展函数
fun User.sayHello(){
println("hello")
}
fun main(args: Array<String>) {
val user = User("")
user.sayHello()
}
输出为 hello
2.当类成员函数与扩展函数签名一样时,优先执行成员函数.
data class User(
@get:NotNull
var username:String,
var password:String? = null,
var createTime:Date? = null,
var updateTime:Date? = null
){
//成员函数
fun sayHello(){
println("hello 成员函数")
}
}
//扩展函数
fun User.sayHello(){
println("hello 扩展函数")
}
fun main(args: Array<String>) {
val user = User("")
user.sayHello()
}
输出: hello 成员函数
2.扩展属性
扩展属性属于静态行为,因此属性声明使用val,若存在成员属性和扩展属性一致,则优先调用成员属性;
data class User(
@get:NotNull
var username:String = "成员username",
var password:String? = null,
var createTime:Date? = null,
var updateTime:Date? = null
)
//扩展属性
val User.height:Double
get() = 180.0
val User.username:String
get() = "扩展username"
fun main(args: Array<String>) {
val user = User()
println(user.height)
println(user.username)
}
输出:
180.0
成员username
扩展属性不可以直接被初始化,必须有getter/setter方法显式的定义;