PS:有小伙伴说配图有点意思,嘿嘿,今天的配图是:
本节我们继续来学习Kotlin的语法,这节学习的是非常常用的类与对象,
把这四节的内容都掌握了,基本就算kotlin入门了不逼逼,开始本节内容
1.类的定义与对象实例化
Kotlin不同于Java,**允许在一个文件中定义多个类**,
首先关注的一点是:类,成员变量,成员方法的作用域,写个简单的例子:
然后打开生成 .class文件 可以看到对应的修饰符:
从中我们可以得出以下结论:
没有任何修饰符,默认是private的,另外成员变量会默认生成 **public final **的 getter和setter方法,
如果使用了private修饰,则不会生成!
一清二楚,另外kotlin中还允许直接class 类名,没有类实体,一般用于
表示概念(没什么卵用)!而创建一个类的对象以及方法调用同样很简单:
这里调用设置对象的属性,其实是调用对应生成的setXXX方法!对了,你还可以
自定义getter和setter方法
然后这里有个坑,就是如果你写成get() = trueHeight,会不停调用自身,然后OOM!
网上有人说在前面加个$,但实测不行,如果有解决方案的务必告知我!
另外,你还可以再get和set方法前加private,这样可以禁止外部调用!
2.构造器(构造方法)
Kotiln中的构造器有三种:
主构造器
- 1.如果一个非抽象类没有声明任何主次构造器,那么会默认生成一个public无参的主构造器!
- 2.一个类只有一个主构造器,类头部的一部分,在类名后,constructor(参数列表),
- 3.主构造器中不能包含任何代码,如果想写一些初始化代码,可以写到init初始化代码块中!
使用示例:
辅助构造器
- 1.写在类中,可以有一个或者多个,用constructor关键字标识!
- 2.可以通过this()调用其他辅助构造器,但是任何一个辅助构造器都必须调用主构造器!
使用示例:
私有主构造器
其实就是在主构造器前加上一个private,然后就只能通过辅助构造器来实例化对象
3.继承
Kotlin中继承父类或者实现接口,直接用 : 引号,如果有多个可以用,逗号隔开,比如:
还记得一开始看class文件,类的默认修饰符是:public final,final意味着,这个类
是不能改变的,如果你想继承这个类,进行一些重写的话,你需要把class前加上 open 关键字,
子类构造方法需实现父类构造方法,而方法的修饰符也是 final 的,如果你想重写
某个方法,同样要为方法加上 open 关键字,而在重写方法处加上 override 关键字;
另外,你还可以用 super 关键字来调用父类中的方法,这点和Java是一样的。
使用示例:
4.接口与抽象类
Kotlin中的接口类似于Java8,支持抽象方法,抽象属性,还支持包含实现的方法
接口与其中的方法默认是 open 的和Java一样,使用 interface 声明!
接口与抽象类的区别在于:接口不能存储状态数据,可以拥有属性,但是这些属性必须
是抽象的,或者提供访问器的自定义实现!
使用示例:
另外,如果一个需要实现的类或接口中包含同名方法,可以使用<>来指明调用的是哪个
父类方法!比如:
5.抽象类
和接口类似,不顾默认是open的,但是对于抽象成员,需要使用 abstract关键字声明!
使用示例:
7.内部类
类可以嵌套在其他类中,如果只是简单的嵌套,内部类是无法访问外部类成员的!
如果你想在内部类中访问外部成员,你需要使用 inner 关键字进行声明。
而匿名内部类就不说了,不知道的可以看回第一节。
8.单例对象与伴生对象
Kotlin中没有 静态属性和方法,如果你想实现类似于单例的功能,
你可以使用关键字 object 声明一个对象,对象的构造器不能提供构造器参数,
在第一次使用的时候会被初始化,可用于提供常量或共享不可变对象!
使用示例:
除此之外,Kotlin中还提供了 伴生对象 这种东西,用companion关键字声明,
可以直接类.成员访问成员,有点类似于静态成员,但是在运行时,它们依旧是实体
的实例成员,另外使用companion关键字时,伴生对象的名称可以省略!
使用示例:
如果你硬是要搞成Java中的静态成员和静态方法的话,你可以用:
静态成员:
- @JvmField注解:生成与该属性相同的静态字段
- lateinit关键字:延迟初始化(没用过)
- const()关键字:将 Kotlin 属性转换成 Java 中的静态字段(定义常量用)
静态方法:
- @JvmStatic注解:在单例对象和伴生对象中生成对应的静态方法
关于这里更多内容可见:http://kotlinlang.cn/docs/reference/object-declarations.html
9.数据类
就是只表示数据的类,用 data 进行声明,默认基于构造方法中实现了:
toString(), componentN(), copy(), equals() 和 hashCode() 方法,
另外,不在构造方法中定义的属性不会产生在toString()的结果中!
Data类可以直接使用 == 进行比较。
使用示例:
10.枚举类
Kotlin中的枚举与Java中基本类似,用 enum 声明为枚举类
使用示例:
除此之外你还可以通过valueOf("名字")来匹配或者values()拿到一个Array,
然后进行遍历。
11.封闭类
限制类的层次结构,值只能是集合中的类型,不饿可以是其他任何类型
可以理解成"扩展的枚举类",枚举中的实例是唯一的,而封闭类可以
有很多实例,他们可以有不同的状态,使用关键字 sealed 声明
(内部的类都是本身的子类),直接子类必须都写在封闭类中!!!
有一点要注意:封闭类的子类的扩展可以在任何地方,不需要写在封闭类内部!
使用密封类的最主要的的好处体现在你使用 when 表达式。
可以确保声明可以覆盖到所有的情形,不需要再使用 else 情形。
没用过,直接祭出官方示例:
本章小结
本节对Kotlin中与类和对象有关的知识点进行了全面的讲解:
- 1.类的定义与对象实例化
- 2.构造器(构造方法)
- 3.继承
- 4.接口与抽象类
- 5.抽象类
- 7.内部类
- 8.单例对象与伴生对象
- 9.数据类
- 10.枚举类
- 11.封闭类
相信对你对Kotlin的认识又更进一步了,大块的东西已经在这四节里面说完,
然后接下来的一节是一些小知识点补充,在下一节是结合Anko重构之前写个
的一个很小的项目,再接着是番外篇——实际开发中用Kotlin中的一些技巧
和实例~敬请期待!
如果觉得这个系列对你学习Kotlin有所帮助,点个喜欢呗~
本节参考文献如下:
- 从零开始的Kotlin之类和对象(一)
- Step into Kotlin
- kotlin-for-android-developers-zh
- 官方文档(英语)
- 官方文档(中文
- Kotlin-in-Chinese
修改日志:
- 2016.11.17 感谢基友Berial指出的错误
1.private修饰变量会生成getter方法的,然而那个方法是自己写的,把自己也给坑了,已修正!
- 2016.11.28 感谢基友静静指出的错误>
1.var定义的变量是private final的,对应的getter和setter才是public final的!已更正!