(二)Kotlin 面向对象

温馨提示

写博客是为了记录在开发过程中所涉及到的技术以及遇到的问题的解决,如果该博客对您有所帮助,希望可以点个关注/喜欢;如果您对文章中的内容有什么不同的见解,欢迎留言进行讨论。谢谢!

一、面向对象的概念

  • 本质上就是解决如何用程序描述世界的问题
  • 讨论如何把实际存在的东西映射成程序的类和对象
  • 一种程序设计的思路、思想、方法
  • 程序设计层面的概念
  • 设计模式:前人的程序设计经验

二、抽象类与接口

相当于半成品与协议

1、接口

  • 接口,直观理解就是一种约定
interface InputDevice{
    fun input(event: Any)
}
  • 接口不能有状态
  • 必须由类对其进行实现后使用

2、抽象类

  • 实现了一部分协议的半成品
  • 可以有状态,可以有方法实现
  • 必须由子类继承后使用

3、抽象类和接口的共性

  • 比较抽象,不能直接实例化
  • 需要有子类(实现类)实现的方法
  • 父类(接口)变量可以接受子类(实现类)的赋值

3、抽象类和接口的区别

  • 抽象类有状态,接口没有状态
  • 抽象类有方法实现,接口只能有无状态的默认实现
  • 抽象类只能单继承,接口可以多实现
  • 抽象类反应本质,接口体现能力

三、类的继承与接口的实现

  • 父类需要 open 才可以被继承
  • 父类方法、属性需要 open 才可以倍复写
  • 接口、接口方法、抽象类默认为 open
  • 复写父类(接口)成员需要 override 关键字
  • class D:A(),B,C
  • 注意继承类时实际上调用了父类构造方法
  • 类只能单继承,接口可以多实现

接口代理

  • class Manager(driver: Driver):Driver by driver
  • 接口方法实现交给代理类实现

接口方法冲突

- 接口方法可以有默认实现
- 签名一致且返回值相同的冲突
- 子类(实现类)必须复写冲突方法
- super<[父类(接口)名]>.[方法名]([参数列表])

四、类及其成员的可见性

Kotlin Java
private private
protected protected
-- default(包内可见)
internal(模块内可见) --
public public

五、object

  • 只有一个实例的类(单例)
  • 不能自定义构造方法
  • 可以实现接口、继承父类
  • 本质上就是单例模式最基本的实现

六、伴生对象与静态成员

  • 每个类可以对应一个伴生对象
  • 伴生对象的成员全局独一份
  • 伴生对象的成员类似Java的静态成员
  • 静态成员考虑用包级函数、变量代替
  • 使用JvmField和JvmStatic,可以让伴生对象在Java中使用时看起来像静态成员和静态方法

七、方法重载(Overloads)和默认参数

重载
  • 写了一个方法和已经存在的方法重名,参数不相同
  • Jvm函数签名的概念:函数名、参数列表
  • 跟返回值没有关系
默认参数
  • 为函数参数设定一个默认值
  • 可以为任意位置的参数设置默认值
  • 函数调用产生混淆时用具名参数
方法重载与默认参数
  • 方法重载与默认参数可以互相转换,在Java中调用有默认参数的方法时,该方法需要使用注解@JvmOverloads
  • 避免定义关系不大的重载方法

八、扩展成员(二次加工)

  • 为现有类添加方法、属性
fun X.y():Z{...}
val X.m 
//注意扩展属性不能初始化,类似接口属性
  • Java 调用扩展成员类似调用静态方法

九、属性代理

  • 定义方法
val/var <property name>: <Type> by <expression>
  • 代理者需要实现相应的setValue/getValue方法
  • by lazy 就是在第一次使用的时候才去实例化对象

十、数据类(data class)

  • 默认实现 copy()、toString()、equals()等方法
  • 编译器默认生成component[1-N]方法,可以自己复写
data class China(val code:Int,name: String)
val (a,b) = China(0,"中国")
pringln("$a -> $b")
  • allOpen和noArg 插件解决data class 的类被解析成final类,并且无空构造方法的问题
//build.gradle 中的 dependencies 中添加 
dependencies{
    classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    classpath "org.jetbrains.kotlin:kotlin-noarg:$kotlin_version"
    classpath "org.jetbrains.kotlin:kotlin-allopen:$kotlin_version"
}

//build.gradle 中 添加插件的应用
apply plugin: 'kotlin-noarg'
apply plugin: 'kotlin-allopen'

// 插件的配置

noArg{
    annotation("注解类名")
}

allOpen{
    annotation("注解类名")
}
  • 属性需要写到构造方法,初始化时需要传入参数

十一、内部类

  • 定义在类内部的类
  • 与类成员有相似的访问控制
  • 默认是静态内部类,非静态用 inner 关键字
  • this@Outter 与 this@Inner
匿名内部类
  • 没有定义名字的类
  • 类名编译时生成,类似Outter$1.class
  • 可继承父类、实现多个接口,与Java 不一样

十二、枚举类

  • 实例可数的类,注意枚举也是类
  • 可以修改构造方法,添加成员
  • 可以提升代码的表现力,也有一定的性能开销

十二、密封类(sealed class)

  • 子类可数的类
  • <V1.1,子类必须定义为密封类的内部类
  • v1.1开始,子类只需要与密封类在同一个文件中
  • 子类可以有多个构造参数
  • 表示状态适合使用枚举,需要传输指令时适合使用密封类

上一篇:(一)Kotlin 基础语法

下一篇:(三)Kotlin 高阶函数

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

推荐阅读更多精彩内容

  • 嵌套类和内部类 大部分时候,类被定义成一个独立的程序单元。在某些情况下,也会把一个类放在另一个类的内部定义,这个定...
    凌寒天下独自舞阅读 435评论 0 0
  • 面向对象编程(OOP) 在前面的章节中,我们学习了Kotlin的语言基础知识、类型系统、集合类以及泛型相关的知识。...
    Tenderness4阅读 4,355评论 1 6
  • 设计模式概述 在学习面向对象七大设计原则时需要注意以下几点:a) 高内聚、低耦合和单一职能的“冲突”实际上,这两者...
    彦帧阅读 3,710评论 0 14
  • Kotlin的类和接口与Java的类和接口是有一定的区别的。Kotlin的接口是可以包含属性声明。Kotlin默认...
    程自舟阅读 10,247评论 0 11
  • 面向对象笔记 一、 对象在内存中的存放方法以及被调用过程 class文件首先被加载到方法区中的class文件内容区...
    VictorBXv阅读 428评论 0 2