Kotlin 语法学习笔记(下)

写了好长时间的移动端程序,都是基于 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 相互交叉的形式展示,希望对大家有帮助

发布了23 篇原创文章 · 获赞 22 · 访问量 3890

猜你喜欢

转载自blog.csdn.net/qq_19154605/article/details/103156990