版权声明:本文为 newtrekWang 原创文章,可以随意转载,但必须在明确位置注明出处!!!

目录

第一章 定义和目的

kotlin的主要特征

  • 目标平台:服务器端,Android及任何Java运行的地方
  • 静态类型
  • 函数式和面向对象
  • 免费且开源

小结

  • fun关键字用来声明函数,val关键字和var关键字分别用来声明只读变量和可变变量
  • 字符串模板帮助你避免繁琐的字符串连接。在变量名称前加上$前缀或者用${}包围一个表达式,来把值注入到字符串中
  • 值对象类在Kotlin中以简洁的方式表示
  • 熟悉的if现在是带返回值的表达式
  • when表达式类似于Java中的switch但功能更强大
  • 在检查过变量具有某种类型之后不必显示地转换它的类型:编译器使用智能转换自动帮你完成
  • for,while,和do-while循环与Java类似,但是for循环现在更加方便,特别是当你需要迭代map的时候,又或是迭代集合需要下标的时候。
  • 简洁的语法1..5会创建一个区间,区间和 数列允许Kotlin在for循环中使用统一的语法和同一套抽象机制,并且还可以使用in运算符和!in运算符来检查值是否属于某一个区间
  • Kotlin中的异常处理和Java非常相似,除了Kotlin不要求你声明函数可以抛出的异常

#第三章 函数的定义和调用

创建集合

kotlin没有自己的集合类,而是采用的标准的Java集合类,kotlin可以更容易地与Java代码交互,可以调用变量的JavaClass查看变量的类型。

让函数更好的调用

调用println(joinToString(set,",","[","]"))
结果:[1,2,3,4,5,6]
joinToString是kotlin集合类默认的方法,可以直接用

命名参数

命名参数

可以显示地表明一些参数的名称,如果在调用一个参数时,指明了一个参数的名称,为了避免混淆,那它以后的所有参数都需要标明名称。

默认参数值

当使用常规的调用语法时,必须按照函数声明中定义的参数顺序来给定参数,可以省略的只有排在末尾的参数。如果使用命名参数,可以省略中间的一些参数,也可以以你想要的任意顺序只给定你需要的参数。

默认参数值

消除静态工具类:顶层函数和属性

在Kotlin中,不需要去创建一个类作为静态函数的容器,相反,可以把这些函数直接放在代码文件的顶层,不用从属于任何的类。这些放在 文件顶层的函数依然的包内的成员,如果你需要从包外访问它,则需要import,但不需要额外包一层。Kotlin编译生成的类的名称,对应于包含函数的文件的名称,这个文件中的所有顶层函数编译为这个类的静态函数,因为Java要调用这个函数的时候和调用静态函数一样
改变包含Kotlin顶层函数的生成的类的名称,需要为这个文件添加@JvmName的注解,将其放到这个文件的开头,位于包名的前面。

顶层属性

和函数一样,顶层属性和顶层函数一样可以放在文件的顶层,和其它属性一样,val只有一个getter,var对应一对getter和setter,如果想要把一个常量public static final的属性暴露给Java,可以用const来修饰它

给别人的类添加方法:扩展函数和属性

扩展函数就是一个类的成员函数,不过定义在类的外面,所要做的就是把要扩展的类或者接口的名称,放到即将添加的函数前面,这个类的名称称为接收者类型;用来调用这个扩展函数的那个对象,叫做接收对象。

导入函数还可以用as改名

Java中调用kotlin的函数就是调用kotlin生成的类文件的静态方法,比如刚才那个方法如果声明在StringUtil.kt的文件中,java中

扩展函数无非就是静态函数的一个高效的语法糖,可以使用具体的类型作为接收者类型,而不是一个类。

不可重写扩展函数

扩展函数并不是类的一部分,它是声明在类之外的。
如果一个类的成员函数和扩展函数有相同的签名,成员函数往往会被优先调用。

扩展属性

扩展属性提供了一种方法,用来扩展类的API,可以用来访问属性,用的是属性语法而不是函数的语法。

调用

可变属性

就是一个set和一个get

处理集合:可变参数,中缀调用和库的支持

可变参数:让函数支持任意数量的参数

vararg 修饰可变参数,数组变量前加*表示展开这个集合

键值对的处理:中缀调用和解构声明

中缀调用可以与只有一个参数的函数一起使用,无论是普通的函数还是扩展函数。要允许使用中缀符号调用函数,需要使用infix修饰符来标记它。

结果:(2,two),一个Pair对象就是一个键值对

字符串和正则表达式的处理

使用String的扩展函数 解析文件路径string

结果:

directory: H:/Users/yorl/kotlin-book fullName: chater.adoc fileName: chater extention: adoc

使用正则表达式解析

在三重引号字符串中,不需要对任何字符串进行转义,包括反斜线

让代码更整洁:局部函数和扩展

如果一个函数内有一些重复操作,可以使用局部函数,局部函数可以访问所在函数中的所有参数和变量。

进一步改进

可以看到扩展函数也可以用局部函数

小结

  • kotlin没有定义自己的集合类,而是在Java集合类的基础上提供了更丰富的API。
  • Kotlin可以给函数参数定义默认值,这样大大降低了重载函数的必要性,而且命名参数让多参数函数的调用更加易读
  • Kotlin可以用扩展函数和属性来扩展任何类的API,包括在外部库中定义的类,而不需要修改其源代码,也没有运行时开销
  • 中缀调用提供了单个参数的,类似调用运算符方法的简明语法
  • Kotlin为普通字符串和正则表达式都提供了大量的方便字符串处理的函数。
  • 三重引号的字符串提供了一种简洁的方式,解决了原本在java中需要啰嗦的的转义和字符串连接的问题

- 局部函数帮助保持代码整洁的同时,避免重复

第四章 类,对象和接口

Kotlin的类和接口与Java的类和接口有一点区别,例如,接口可以包含属性声明,与Java不同,Kotlin的声明默认是final和public的,此外,嵌套的类默认并不是内部类,它们并没有包含对其外部类的隐式引用。

4.1 定义类继承结构

kotlin的接口

  • 使用interface关键字声明接口.
  • Kotlin在类名后面使用冒号代替了Java中的extends和implements关键字,和Java一样,一个类可以实现任意多个接口,但是只能继承一个类。override修饰符用来标注被重写的父类或者接口中的方法和属性,并且是kotlin中的override修饰符是强制要求的。
  • 接口的方法可以有一个默认实现

open,final和abstract修饰符:默认为final

java的类和方法默认是open的,而kotlin默认是final的,如果想允许创建一个类的子类,需要使用open修饰符来标示这个类,此外,需要给每一个可以被重写的属性或方法添加open修饰符

注意:如果重写了一个基类或者接口的成员,重写了的成员同样默认是open的,如果想改变这一行为,阻止你的类的子类重写你的子类,可以显示地标注为final

abstract 声明抽象类,这种了不能实例化,一个抽象类通常包含一些没有实现并且必须在子类重写的抽象成员,抽象成员始终是open的,所有不需要显示的使用open修饰符

修饰符 相关成员 评注
final 不能被重写 类中成员默认使用
open 可以被重写|需要明确的表明
abstract 必须被重写|只能在抽象类中使用;抽象成员不能有实现
override 重写父类或接口中的成员|如果没有使用final,重写的成员默认是开放的

可见性修饰符:默认为public

Javaz中的默认可见性--包私有,在Kotlin中并没有使用,Kotlin只把包作为在命名空间里组织代码的一种方式使用,并没有将其用作可见性控制。Kotlin提供了一个新的修饰符,internal,表示只在模块内部可见,一个模块就是一组一起编译的kotlin文件

修饰符 类成员 顶层声明
public(默认) 所有地方可见 所有地方可见
internal 模块中可见 模块中可见
protected 子类中可见 -
private 类中可见 文件中可见

内部类和嵌套类:默认是嵌套类

类A在另一个类B中声明 在Java中 在Kotlin中
嵌套类(不存储外部类的引用) static class A class A
内部类(存贮外部类的引用) class A inner Class A

密封类:定义受限的类继承结构

4.2 声明一个带非默认构造方法或属性的类

初始化类:主构造函数和初始化语句块

如上图是两种声明类的方式,方式二用到了关键字constructor和init,constructor用来开始一个主构造方法或从构造方法的声明,init用来引入一个初始化语句块,这种语句快包含了在类被创建时执行的代码,并会与主构造方法一起使用。

当然再简化可以这样:

构造方法:用不同的方式来初始化父类

实现在接口中声明的属性

通过getter和setter访问支持字段

修改访问器的可见性

编译器生成的方法:数据类和类委托

通用对象方法

toString(),

toString跟Java的一样

equals()

再Kotlin中,==检查对象是否相等,而不是比较引用,所以Kotin的==实际调用的是equals,如果要比较引用要用===

hashCode()

hashCode()方法通常与equals一起被重写。

所以不同对象默认的hashCode都是不一样的,所以要用hash容器,一般要重写类的hashCode方法

输出为true

数据类:自动生成通用方法的实现

如果想要你的类是一个方便的数据容器,你需要重写这些方法:toString,equals和hashCode。实现很简单,IDEA都可以帮你做,不过在kotlin中就不必要了,只要为你的类添加data关键字即可,想要的方法将会自动生成好。

equals和hashCode方法会将所有在主构造方法中声明的属性纳入考虑,生成的equals方法会检测所有的属性的值是否相等。hashCode方法会返回一个根据所有属性生成的哈希值,不过注意没有在主构造方法中的属性将不会加入相等性检查和哈希值计算中去。

数据类和不可变性:copy方法

为了让使用不可变个对象的数据类变得更容易,Kotlin编译器为他们多生成了一个方法:一个允许copy类的实例的方法,并在copy的同时修改某些属性的值。

类委托:使用“by"关键字

有时候常常需要像其他类添加一些行为,即使它并没有被设计为可扩展的,一个常用的实现方式是装饰器模式,这种模式的本质就是创建一个新类,实现与原始类一样的接口并将原来的类的实例作为一个字段保存。与原始类拥有同样行为的方法不用被修改,只需要直接转发到原始类的实例。Kotlin不需要写相当多的样板代码

object 关键字,将声明一个类与创建一个实例结合起来

对象声明,创建单例易如反掌

使用对象来实现Comparator

伴生对象:工厂方法和静态成员的地盘

kotlin中的类并不拥有静态成员:Java的static关键字并不是Kotlin语言的一部分,作为代替,Kotlin依赖包级别函数和对象声明和对象声明,在大多数情况下,还是推荐用顶层函数。

应用于工厂方法

作为普通对象使用的伴生对象

伴生对象是一个声明在类中的普通对象,它可以有名字,实现一个接口或者有扩展函数或属性

对象表达式:该变写法的匿名内部类

可以用object声明匿名内部类,不过跟Java的不一样,它可以实现多个接口或者不实现接口,然后实现里面可以改变外部的var变量,非常方便

Lambda编程

Lambda表达式和成员引用

作为函数参数的代码块

把函数当作值来对待,可以直接传递函数,而不需要先声明一个类再传递这个类的实例。使用lambda表达式之后,代码会变得更加简洁,都不需要声明函数了,可以高效地直接传递代码块作为函数参数。
例:

##

Hits: 55

分类: Kotlin

发表评论

电子邮件地址不会被公开。 必填项已用*标注