Kotlin编程相关知识点介绍:
- Kotlin编程之使用Intellij IED和了解源文件(.kt)
- Kotlin编程之类的介绍和使用
- Kotlin编程之类的属性
- Kotlin编程之方法
- Kotlin编程之父类和继承父类
- Kotlin编程之接口和实现接口
- Kotlin编程之伴生对象,抽象类,密封类
- Kotlin编程之嵌套类,内部类,匿名内部类
- Kotlin编程之对象的表达式和声明
- Kotlin编程之扩展方法
扩展属性
在Kotlin编程,对类的函数进行扩展外,也支持属性扩展。
package com.xingen.kotlin.day2017527
fun main(args: Array<String>) {
var list=listOf("1",2,"3")
println(list.lastIndex)
}
/**
* 属性扩展
* 这里,给List类扩展一个lastIndex的属性,但是不会真的作为成员属性。
*/
val <T> List<T>.lastIndex:Int get(){
//等同于get=size-1,这里返回最后一个元素的角标
return this.size-1
}
输出结果:
2
可知:
- 扩展并不会真正给类添加了成员属性,因此也没有办法让扩展属性拥有一个备份字段.这也是为什么初始化函数不允许有扩展属性。
- 扩展属性只能够通过明确提供 getter 和 setter方法来进行定义.
伴生对象的扩展
在Kotlin编程中,一个类定义了伴生对象,也可以给伴生对象的属性扩展和函数扩展。
package com.xingen.kotlin.day2017527
fun main(args: Array<String>) {
Day2017527.test()
}
/**
* 定义伴生对象
*/
class Day2017527{
companion object{
}
}
/**
* 伴随对象扩展:
* 这里扩展一个方法
*/
fun Day2017527.Companion.test(){
println("伴随对象的扩展")
}
输出结果:
伴随对象的扩展
可知:
- 若是给伴生对象定义的属性扩展或者函数扩展,可以直接通过类名来调用。
扩展的作用域
在Test.kt中编写代码如下:
package com.xingen.kotlin.day2017527
/**
* 对函数进扩展:
* 在函数前面指定一个接受者,这里的接受者是MutabList<E>集合。
* 为它扩展一个swap函数
* 扩展函数的this指向接受者对象。
*
*/
fun <T> MutableList<T>.swap(x:Int,y:Int){
//利用一个中间变量,互换之指定位置的值。
val temp=this[x]
this[x]=this[y]
this[y]=temp
}
在Day2017527.kt中编写代码如下:
package com.xingen.kotlin.day2017527
//导入需要用到扩展函数所在的包
import com.xingen.kotlin.day2017527.*
/**
* Created by ${新根} on 2017/5/28 0028.
* 博客:http://blog.csdn.net/hexingen
*/
fun main(args: Array<String>) {
/**
* 调用MutablListOf类的扩展方法swap( )
*/
var mutableList=mutableListOf("1",2,3)
println(mutableList)
//使用自定义的扩展函数
mutableList.swap(0,2)
println(mutableList)
}
输出结果:
[1, 2, 3]
[3, 2, 1]
可知:
在一个源文件中,编写包级别的扩展函数,在另外一个源文件中可以进行使用。
导入方式如下:
- 导入对应的包,这里是
import com.xingen.kotlin.day2017527.*
。 - 当然也可以导入具体的路径,包.扩展函数名,这里是
import com.xingen.kotlin.day2017527.swap
。
扩展的好处
通过函数扩展,属性扩展,伴生对象扩展的接触,方面自定义一些常用的功能代码。这在java编程中,通常是放到util类中。在Kotlin编程,通过扩展可以实现工具类的作用。