写了好长时间的移动端程序,都是基于 Java 的,时代在改变,现在有好多 Kotlin 的示例,虽然不一定以后会用到 Kotlin 去构建工程,但是不好说会有需要参考的 Kotlin 示例,直接看 Kotlin 的工程感觉有点吃力,学一点新的语言,丰富一下自己的技术宽度。
注:以下示例都是基于 Android 平台
Kotlin 泛型
泛型一般来说是比较不常用的,使用了泛型会增加代码可读性的难度,但是对于爱偷懒的程序员来说,确实很实用的特性;在处理弹出框的时候,样式大体相似,数据格式不同,用泛型可以很好的处理
fun <T, V> testFunc(age : T, name : V) {
if (age is Int) {
// to do
}
}
泛型在使用时有 in、out 关键字或者不设置,这两个关键字会限定类型的使用区域,没有设置关键字时,没有上述的限制
class TestAA<out AA, in BB>(aaa : AA, bbb : BB) {
// 泛型设置了 out,后续在使用时,只能作为输出的类型,不能作为入参的类型
fun aa() : AA {
var letOut : AA? = null
return letOut!!
}
// 泛型设置了 in,后续在使用时,只能作为入参的类型,不能作为输出的类型
fun bb (letIn : BB) {
}
}
Kotlin 对象表达式和对象声明
在写 java 的安卓程序时,回调是非常常见的,点击按钮的事件监听,在 Kotlin 中通过 object 来实现匿名实例(对象表达式的方式)
interface AInterface {
var testName : String //接口类中不允许初始化
open fun func() {
Log.e("XXX", "==========")
}
}
//调用处代码
{
var aaa = object: AInterface {
override var testName: String = "xxx" //在实现接口时,强制初始化成员变量
get() = field
set(value) {
field = value
}
override fun func() {
Log.e("XXX", "=====================")
}
}
}
可以使用该特性,做单例模式
object Single { //懒汉模式
var name:String = "name"
}
// 调用处
{
Single.name
}
Kotlin 可以通过对象表达式实现一个匿名内部类,但是这个类的作用范围有限,只在本地
class TestC {
// 私有函数,所以其返回类型是匿名对象类型
private fun func() = object {
val x: String = "x"
}
// 公有函数,所以其返回类型是 Any
fun publicFunc() = object {
val x: String = "x"
}
}
Kotlin 扩展
之前用 Java 的时候,有时候会有这样的困惑,在调用一个对象的时候,发现没有定义一个方法,这个时候,一般只能在类定义的地方增加新的函数,Kotlin 提供的扩展,就可以很好的处理这个问题,发现没有想要的方法,直接给类扩展函数,示例代码如下
class Student(testName : String) //主要构造函数
{
var name : String = ""
get() = field // get 方法;如果在 属性的结尾加了 ; 后续的 get set 方法,将不能识别
set(value) { // set 方法
field = value
}
// 主构造函数的初始化
init {
this.name = testName;
}
}
//调用处
{
//直接扩展新的函数
fun Student.hello () {
Log.e("XXX","hello I'm " + name);
}
var stu = Student("a")
stu.hello()
}
注:扩展函数是静态解析,并不是接收者类型的虚拟成员,在调用扩展函数时,具体被调用的的是哪一个函数,由调用函数的对象表达式来决定,而不是动态的类型决定的;存在扩展函数和成员函数一直的情况,此时,在使用该函数时,会优先使用成员函数
扩展的特性通常也被用来定义单例
class MyClass private constructor(){
companion object {
private var ret : MyClass? = null
get() {
if (field == null) {
field = MyClass()
}
return field
}
@Synchronized
fun getInstance() : MyClass {
Log.e("XXX", "123")
return ret!!
}
}
}
//调用处
{
MyClass.getInstance()
}
kotlin 委托
有如下的示例代码
interface Papa {
fun run() {
Log.e("XXX", "xxxxxxxxx")
}
}
class Child : Papa {
override fun run() {
Log.e("XXX", "----------------");
}
}
class Sister(child : Child) : Papa by child
//调用处
{
var child = Child()
Sister(child).run()
}
委托的特性类似继承和代理的集合体,Papa 表示继承的接口,接口的实现使用 by 关键字后面的对象的实现
输出日志如下
总结:一共用了三期学习了 kotlin 的基本语法,涉及的内容都是很基础的内容,这些基础的内容,已经满足实现 Android App 的要求,早前发出来的射击程序就是在第二部分学习结束之后,发出来的;知识的掌握不在于学了多少,在于熟练多少,后续文章的示例代码会以 Java Kotlin 相互交叉的形式展示,希望对大家有帮助