Kotlin语言学习笔记

〇、前言

在2017年的Google开发者大会上Google引入了新的Android开发语言Kotlin,2019年的开发者大会上Google 更进一步,宣布Kotlin Frist。伴随的Google的推动,这几年越来越多的Android开发从Java转为Kotlin,一些著名的三方库也在采用Kotlin重写。所以是时候总结一下Kotlin的学习笔记了,以期温故而知新。我的学习路线主要是按照《第三行代码》进行的的,所以笔记也以《第三行代码》为主。

一、面向对象

1.2构造函数:

构造函数:任何一个面向对象的编程语言都会有构造函数的概念,Kotlin中也有,但是Kotlin将构造函数分成了两种:主构造函数和次构造函数。

主构造函数:主构造函数的特点是没有函数体,直接定义在类名的后面即可。每个类默认都会有一个不带参数的主构造函数,当然也可以显式地给它指明参数。主构造函数将会是我们最常用的构造函数。

另外:所有主构造函数中的逻辑都可以写在init结构体里面。

在主构造函数中声明成val或者var的参数将自动成为该类的字段,如果主构造函数中的参数前面不加任何关键字,它的作用域就仅限定在主构造函数当中。

次构造函数:次构造函数是通过constructor关键字来定义的,是有函数体的。任何一个类只能有一个主构造函数,但是可以有多个次构造函数。次构造函数也可以用于实例化一个类,这一点和主构造函数没有什么不同。

Kotlin规定,当一个类既有主构造函数又有次构造函数时,所有的次构造函数都必须调用主构造函数(包括间接调用)。

Kotlin允许类中只有次构造函数,没有主构造函数。当一个类没有显式地定义主构造函数且定义了次构造函数时,它就是没有主构造函数的。

1.3继承:

  • 在Kotlin中任何一个非抽象类默认都是不可以被继承的,相当于Java中给类声明了final关键字。(Effective Java这本书中明确提到,如果一个类不是专门为继承而设计的,那么就应该主动将它加上final声明,禁止它可以被继承。)要让类可以被继承,在类的前面加上open关键字即可;
  • 在Java中继承的关键字是extends,而在Kotlin中变成了一个冒号(:);
  • Java继承特性中子类的构造函数必须调用父类的构造函数,这个规定在Kotlin中也要遵守。Kotlin中子类的主构造函数调用父类中的哪个构造函数,在继承的时候通过括号来指定,即使在无参数的情况下,这对括号也不能省略;

1.4接口:

Java是单继承结构的语言,任何一个类最多只能继承一个父类,但是却可以实现任意多个接口,Kotlin也是如此;

Java中继承使用的关键字是extends,实现接口使用的关键字是implements,而Kotlin中统一使用冒号,中间用逗号进行分隔。另外接口的后面不用加上括号,因为它没有构造函数可以去调用;

Kotlin中使用override关键字来重写父类或者实现接口中的函数;

同JDK 1.8一样,Kotlin允许对接口中定义的函数进行默认实现。如果接口中的一个函数拥有了函数体,这个函数体中的内容就是它的默认实现。默认实现函数子类可以自由选择实现或者不实现,不实现时就会自动使用默认的实现逻辑。

1.5函数的可见性修饰符

Java和Kotlin函数可见性修饰符对照表

修饰符

Java

Kotlin

public

所有类可见

所有类可见(默认)

private

当前类可见

当前类可见

protected

当前类、子类、同一包路径下的类可见

当前类、子类可见

default

同一包路径下的类可见(默认)

internal

同一模块中的类可见

1.6数据类:

data:当在一个类前面声明了data关键字时,就表明你希望这个类是一个数据类,Kotlin会根据主构造函数中的参数帮你将equals()hashCode()toString()等方法自动生成。

1.7单例类:

虽然Java中的单例实现并不复杂,但是Kotlin做得更好,它将一些固定的、重复的逻辑实现隐藏了起来,只暴露给我们最简单方便的用法。在Kotlin中创建一个单例类的方式极其简单,只需要将class关键字改成object关键字即可。在Kotlin中我们不需要私有化构造函数,也不需要提供getInstance()这样的静态方法,只需要把class关键字改成object关键字,一个单例类就创建完成了。

二、Lambda编程

Kotlin中的Lambda功能极为强大

2.1集合的创建:

  • listOf()函数用来创建一个不可变的list集合(只能用于读取,无法对集合进行添加、修改或删除操作),mutableListOf()函数用来创建一个可变的list集合;
  • setOf()函数用来创建一个不可变的set集合,mutableSetOf()函数用来创建一个可变的set集合;
  • mapOf()函数用来创建一个不可变的map集合,mutableMapOf()函数)函数用来创建一个可变的map集合;
  • 在Kotlin中并不建议使用put()get()方法来对Map进行添加和读取数据操作,而是更加推荐使用类似于数组下标的语法结构;

2.2集合的函数式API:

Lambda的定义:Lambda就是一小段可以作为参数传递的代码。

Lambda表达式的语法结构:{参数名1: 参数类型, 参数名2: 参数类型 -> 函数体}

猜你喜欢

转载自blog.csdn.net/beita08/article/details/113731887