Kotlin搞起来——4.类与对象


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有所帮助,点个喜欢呗~

本节参考文献如下


修改日志

  • 2016.11.17 感谢基友Berial指出的错误

1.private修饰变量会生成getter方法的,然而那个方法是自己写的,把自己也给坑了,已修正!

  • 2016.11.28 感谢基友静静指出的错误>

1.var定义的变量是private final的,对应的getter和setter才是public final的!已更正!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,636评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,890评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,680评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,766评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,665评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,045评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,515评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,182评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,334评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,274评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,319评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,002评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,599评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,675评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,917评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,309评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,885评论 2 341

推荐阅读更多精彩内容