扩展函数和属性能够定义在对应的类中和kotlin文件中;java
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.当类成员函数与扩展函数签名同样时,优先执行成员函数.this
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 成员函数
扩展属性属于静态行为,所以属性声明使用val,若存在成员属性和扩展属性一致,则优先调用成员属性;spa
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方法显式的定义;code