参考链接

示例来自bilibili Kotlin语言深入解析 张龙老师的视频

基础部分

Kotlin学习笔记 第一章开始 第二章 基础_积跬步 至千里-CSDN博客

类与继承

Kotlin学习笔记 第二章 类与对象 第一节类与继承(补)_积跬步 至千里-CSDN博客

属性

Kotlin学习笔记 第二章 类与对象 第二节属性_积跬步 至千里-CSDN博客

接口

Kotlin学习笔记 第二章 类与对象 第三节接口 第四节 函数式接口_积跬步 至千里-CSDN博客

可见性 扩展属性与方法

Kotlin学习笔记 第二章 类与对象 第五节 可见性 第六节 扩展_积跬步 至千里-CSDN博客

部分重点

if可以作为表达式

when表达式

in 关键字

主构造函数 次构造函数 什么情况constructor关键字可以省略

补充: 在JVM上 如果主构造方法的所有参数都有默认值 那么Kotlin编译器会为这个类生成无参构造方法,这个无参的构造方法会使用这些默认值。这样做可以与String框架更好的兼容

init 代码块 init块执行的顺序与它所在的位置有关

string模板

Kotlin中所有类默认是final的 final与open相反 想要扩展一个类 需要加上open关键字

补充:1.在Kotlin中如果有主构造函数 次构造函数必须通过this关键字调用主构造方法 或者通过this关键字调用其他次构造方法再间接调用主构造方法

补充:2.如果一个类继承了另外一个类 且没有主构造方法 那么这个类的次构造方法必须用super关键直接或通过其他次构造方法间接调用父类的构造方法

/*** 1 在Kotlin中如果有主构造函数 次构造函数必须通过this关键字调用主构造方法* 或者通过this关键字调用其他次构造方法再间接调用主构造方法*/
class SingleClass(name: String) {constructor(name: String, age: Int) : this(name)constructor(name: String, age: Int, address: String) : this(name, age)
}/*** 2 SingleClass2后面有括号代表有一个无参的主构造方法* 如果没有括号则代表没有主构造方法*/
class SingleClass2() {constructor(name: String, age: Int) : this()constructor(name: String, age: Int, address: String) : this(name, age)
}open class Parent2 {constructor(name: String)
}class Child1(name: String) : Parent2(name) {
}/*** 3 如果一个类继承了另外一个类 且没有主构造方法 那么这个类的次构造方法必须用super关键直接或通过其他次构造方法间接调用父类的构造方法*/
class Child2 : Parent2 {// 直接调用constructor(name: String) : super(name)// 间接调用constructor(name: String, age: Int) : this(name)
}

val 可以覆盖val

var可以覆盖var和val

val不能覆盖var

对象声明 object xx 对象声明其实是一个饿汉式单例

Kotlin中的静态方法:定义在顶层空间即可

伴生对象

伴生对象如果没有定义名字 它的会有一个默认名字 Companion

补充:

伴生对象内部会生成一个静态内部类

伴生对象的属性和方法看起来像静态成员 但是在运行期 他们依旧是真实对象的实例成员 想要将他们变成真正的静态方法与属性 可以通过加上 @JvmStatic 注解实现 加上这个注解

幕后字段field

lateinit:

Kotlin规定非空类型属性必须在构造函数中初始化 如果不想这么做 可以使用延迟初始化

lateinit使用前提

1.lateinit不能用在主构造方法的属性上

2.lateinit修饰的属性不能有自定义get set方法

3.属性类型需要为非空 且不能是原生数据类型

可见性 private protected internal public

扩展属性与扩展方法

扩展函数的解析是静态的

1.扩展本身不会真正修改目标类(它不会真的插入属性或方法 而是在调用时将当前对象作为第一个参数传递进去 然后调用方法或者属性)

2.扩展函数的解析是静态的 它不是动态的 不支持多态 调用取决于声明类型

3.调用由对象声明类型决定 而不是实际类型

open class AA
class BB : AA()fun AA.a() = "a"
fun BB.a() = "b"fun myPrint(aa: AA) {println(aa.a())
}fun main() {myPrint(AA())// 扩展函数的解析是静态的 不支持多态 调用由对象声明类型决定myPrint(BB())
}class D03Add2 {}

可以对可空类型进行扩展

/*** 1 扩展方法名字与成员方法名字冲突* 成员方法优先*/
class CC {fun foo() {println("member")}
}fun CC.foo() {println("member2")
}/*** 2 扩展方法支持重载*/
fun CC.foo(string: String) {println("member2 $string")
}fun main() {// 扩展方法名字与成员方法名字冲突 成员方法优先CC().foo()// 扩展方法支持重载CC().foo("aa")
}

扩展作用域

1.扩展函数所定义的类的实例叫分发接收者(dispatch receiver)

2.扩展函数所扩展的那个类的实例叫做扩展接收者(extension receiver)

3.当两个名字冲突时 扩展接收者优先级更高

// DD的实例代扩展接收者
// 扩展函数所扩展的那个类的实例叫做扩展接收者
class DD{fun method(){println("Do method")}
}// EE的实例代表分发接收者
// 扩展函数所定义的类(EE)的实例 做扩展接收者(extension receiver)
class EE {fun method2(){}// DD 的扩展方法可以调用分发接收者的方法 也可以调用扩展接收者的方法fun DD.hello(){method()}fun DD.output1(){// 当扩展接收者和分发接收者 两个名字冲突时 扩展接收者优先级更高println(toString())}fun DD.output2(){// 当扩展接收者和分发接收者 两个名字冲突时 扩展接收者优先级更高 但是可以用this@EE 绕过这一限制println(this@EE.toString())}fun test(){val dd = DD()dd.output1()dd.output2()}
}fun main() {var dd = DD()// dd.hello() // 调用失败 扩展分发如果在非顶层空间定义 其有效范围只在其定义的类中有效EE().test()
}
// 扩展可以很好解决Java类中各种辅助类过多的情况
class D03Add4 {
}

函数式接口

只有一个方法的接口 可以用lambda表达式替换

========================================

数据类

Kotlin学习笔记 第二章 类与对象 第七节 数据类_积跬步 至千里-CSDN博客

枚举类 密封类

Kotlin学习笔记 第二章 类与对象 第十一节 枚举类 第八节密封类_积跬步 至千里-CSDN博客

泛型

Kotlin学习笔记 第二章 类与对象 第九节 泛型_积跬步 至千里-CSDN博客

内部类嵌套类

Kotlin学习笔记 第二章 类与对象 第十节 内部类嵌套类_积跬步 至千里-CSDN博客

对象表达式与对象声明 类型别名

Kotlin学习笔记 第二章 类与对象 第十二 十三节 对象表达式与对象声明 类型别名_积跬步 至千里-CSDN博客

委托

Kotlin学习笔记 第二章 类与对象 第十四 十五节 委托 委托属性_积跬步 至千里-CSDN博客

数据类

解构声明

密封类 密封类从某种角度上看是枚举类的升级版

泛型 协变 逆变 不变 星投影 类型投影

嵌套类 嵌套类无法访问外部类的属性和方法

内部类

内部类 vs 嵌套类 内部类使用inner关键字修饰 内部类有一个外部类的引用 因此内部类可以在类体中访问外部类的属性和方法 嵌套类不行

内部类访问外部类方法 this@Outer2.test() // 调用外部类的方法

对象表达式格式为 object [:若干父类型, 中间用都会分隔]{

}

匿名对象

匿名对象只能在局部变量范围内或是被private修饰的成员变量范围内才能被识别出真正的类型

如果将一个匿名对象当作public方法的返回类型或是public属性的类型 那么改方法/属性的真正类型就是这个匿名对象所声明的父类型,如果他没有声明父类型 那么其类型是Any

这种情况下 匿名对象中所声明的任何成员都是无法访问的

枚举

对象表达式 vs 对象声明

1.对象表达式时立刻初始化或执行的

2.对象声明是延时初始化的 首次访问才会初始化

3.伴生对象是在其所对应的类被加载时初始化的 对应Java的静态初始化

4.对象声明 : object单独使用

5.对象表达式 :object 对象作为参数或者被用于赋值 例如匿名内部类

委托

属性委托的原理

对于每个委托属性来说 Kotlin编译器会在底层生成一个对应的辅助属性,将所有对原属性的操作 都转交为对该辅助属性的操作

例如 有委托属性prop Kotlin编译器会在底层生成一个对应的辅助属性prop$delegate 所有对prop的操作(包括读写) 都会委托给

这个由kotlin编译器生成的额外的辅助属性

属性委托分类

1 延迟属性 Lazy

2 非空属性

3 可观测属性

4 map 属性委托

接口委托的原理

by关键字后面的类 实际上会有一个对象实例存储在委托类内部 编译器会将当前类的所有方法实现出来, 在实现内部调用委托对象的实例的对应方法

可读可写的属性的委托:

可以选择实现ReadWriteProperty<Any?,String>的两个方法 也可以自己写这两个方法

提供委托

Kotlin学习笔记19 阶段复习1相关推荐

  1. Kotlin学习笔记20 阶段复习2

    参考链接 示例来自bilibili Kotlin语言深入解析 张龙老师的视频 lambda表达式 内联函数 Kotlin学习笔记 第三章 函数 高阶函数 lambda表达式 内联函数_积跬步 至千里- ...

  2. Kotlin学习笔记12——数据类和密封类

    Kotlin学习笔记12--数据类和密封类 前言 数据类 在类体中声明的属性 复制 componentN 解构声明 密封类 尾巴 前言 上一篇,我们学习了Kotlin中的拓展,今天继续来学习Kotli ...

  3. 区块链学习笔记19——ETH难度调整

    区块链学习笔记19--ETH难度调整 学习视频:北京大学肖臻老师<区块链技术与应用> 笔记参考:北京大学肖臻老师<区块链技术与应用>公开课系列笔记--目录导航页 前面学过,比特 ...

  4. Kotlin学习笔记(一)

    文章目录 Kotlin学习笔记 变量申明 只读变量 类型推断 编译时常量 引用类型和基本数据类型 if表达式 when String 模板 函数头 函数参数 Unit函数 Nothing类型 反引号中 ...

  5. 专升本学习计划各个阶段复习程度------2022年你的升本计划,请注意查收!!!

    专升本学习计划各个阶段复习程度------2022年你的升本计划,请注意查收!!! 此文章分享给需要专升本的同学,请关注收藏哟!! 提示:更多精品文章请关注gzh[沐思博客] 阶段目录 专升本学习计划 ...

  6. Kotlin 学习笔记(八)—— Kotlin类与对象之接口

    Kotlin 学习笔记(八)-- Kotlin类与对象之接口 Kotlin学习笔记系列教程 Kotlin 学习笔记(一)-- 概述.学习曲线.开发工具.参考资料 Kotlin 学习笔记(二)-- 基础 ...

  7. Ext.Net学习笔记19:Ext.Net FormPanel 简单用法

    Ext.Net学习笔记19:Ext.Net FormPanel 简单用法 FormPanel是一个常用的控件,Ext.Net中的FormPanel控件同样具有非常丰富的功能,在接下来的笔记中我们将一起 ...

  8. springmvc学习笔记(19)-RESTful支持

    springmvc学习笔记(19)-RESTful支持 标签: springmvc springmvc学习笔记19-RESTful支持 概念 REST的样例 controller REST方法的前端控 ...

  9. Kotlin学习笔记(3)- 语法

    系列文章全部为本人的学习笔记,若有任何不妥之处,随时欢迎拍砖指正.如果你觉得我的文章对你有用,欢迎关注我,我们一起学习进步!kotlin学习笔记系列首发简书和CSDN Kotlin学习笔记(1)- 环 ...

最新文章

  1. 手工纸盒子_不锈钢水槽如何选购,拉伸水槽与手工槽制造工艺有何区别
  2. Python中单线程、多线程与多进程的效率对比实验
  3. VTK:可视化之TransformActorCollection
  4. condition的作用
  5. Python字典二次开发实现稀疏矩阵表示与简单计算
  6. fft qt 代码_最简洁的FFT代码(C++实现)
  7. java集群调度_集群环境下定时调度的解决方案之Quartz集群
  8. linux shell 递归统计代码行数
  9. 软件测试 接口测试 入门Jmeter 接口关联 提取器 断言 与fiddler配合使用 使Jmeter录制和创建脚本 操作数据库 持续集成测试
  10. 电商管理后台 API 接口文档
  11. Python + Graphviz 绘制神经网络结构图
  12. Excel宏编程代码,根据混合的名次合并计算进退值
  13. 矩阵乘法 mpi c语言,MPI实现矩阵相乘
  14. 年轻人的996,马爸爸们的人血馒头与血汗工厂的历史宿命
  15. 网站443端口经常受到攻击怎么办
  16. 联想电脑如何修复计算机系统,Lenovo电脑如何用已备份的系统进行一键恢复
  17. 谈谈keep-alive的理解
  18. CAD图纸显示不全?别慌,有浩辰CAD!
  19. matlab二维绘图部分
  20. 蒙太奇服务器维修,蒙太奇服务器多台互连导片方法

热门文章

  1. android隐藏底部栏,Android4.0平板开发之隐藏底部任务栏的方法
  2. php ipg 透明,产品中心
  3. java 一个大事务下的新增、修改、查询_一文带你轻松搞懂事务隔离级别(图文详解)...
  4. 获取android com包名,Android系统中获取进程(和顶端包名)
  5. 以后可得记住了--Python笔试面试题小结
  6. Java 导出 Excel 文件
  7. Oracle删除重复数据并且只留其中一条数据
  8. 基于I2C总线的MPU6050学习笔记
  9. 禁止选择文字和文本超出显示省略号
  10. idea没有代码自动提示功能和包自动引入不了问题