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