
1、“静态”的替代品在Kotlin中静态的概念被去除了,因此既没有静态变量也没有静态方法。可以用它的等价写法,单例类对象。在Kotlin中object是一个关键词,使用它修饰一个类,替换掉class关键字,表示创建一个类,并创建一个这个类的对象,实际上就是一个单例。使用它的时候可以直接用类名进行方法。类似java中静态变量和静态方法的用法,所以object是java的static替代品之一。当然,如果希望一个类不是单例的,又要它有类似静态的变量和函数。可以在类的内部写一个object。就可以把内部object的属性和函数当做外部class的静态属性和函数了。内部定义object,Kotlin还提供了一种专门的方法。在object的左边写上companion关键字,可以直接省略object的名字。它的作用就是让这个类有一个没有名字的object,简化它的写法。这个对象称为这个类的“伴生类对象”。在使用时就可以通过class的类名直接访问伴生类对象的变量和函数,这种用法跟Java的静态变量和方法一样。伴生类对象就是Java静态变量和方法在Kotlin中的等价写法。在Kotlin中还提供一种更简单的写法:顶层声明(top-level declaration)把属性和函数声明不写在class里,而是直接写到一个文件中。这样写的属性和函数,不属于任何class而是属于package,它跟静态变量和方法一样,是全局的,而且用起来更加方便,连类名都不需要写,直接用就可以。这种写法的属性和函数会脱离于class,写多了会给人堆积如山一团糟的担忧。它也有优点,由于被暴露在顶级,这些方法可以被AS的代码提示所显示出来。避免功能相同的函数,尤其工具函数,在不同包中被重复多次的写。写这种函数通常要注意命名恰当,让人一看就知道函数是做什么的。Kotlin各种库提供了很多的top-level工具类实现。如MathJVM.kttop-level function、object和companion object。都可以实现实现Java静态函数的功能。在使用时,如果写工具类,可以创建一个文件,里面全部写功能相关的top-level function;如果只是针对类的,不是外部使用者的属性和方法,如常见的定义TAG,可以用companion object;定义单例实例可以使用object。companion object和object是可以用父类和接口的,所以可以对全局函数进行功能扩展和延伸。2、主构造函数Kotlin中有“主构造函数”的说法,我们可以用主构造函数里的参数值给成员变量赋值。java的构造函数是用于创建对象的特殊方法,这一点Kotlin也是一样。对于函数来说最重要的部分是它的函数体,就是“{}”括起来的部分,它主要是描述函数的行为。可以看到Kotlin的主构造函数是没有函数体的。实际上Kotlin主构造函数的定位并不是一个函数,而是一个入口,一个接收参数的入口。接收用来初始化对象的参数。Kotlin主要在两个地方进行初始化工作:1、属性的初始赋值,在属性声明的等号右边使用主构造函数的参数;2、在init代码块执行初始化相关的逻辑,这里也可以直接使用主构造函数的参数。在主构造函数接收参数,就能在初始化过程中不同位置使用这些参数,完成对象的初始化。主构造函数是可选的,不是必须的。不过一旦写了,则每一个次级构造函数都要主动调用主构造函数,因为对象的初始化要用到主构造函数,不然对象初始化过程是缺失参数的。当然不写的话,AS也会报编译的错误。更进一步,Kotlin提供一种便捷的写法,可以直接把类的成员变量声明在主构造函数的参数,使用var或val关键字。它的原理就是这个参数除了被当做函数参数之外,Kotlin还会帮我们在类里自动创建一个和参数同名的属性,并把这个参数的值作为属性的初始值。