简介:
Kotlin 是一种在 Java 虚拟机上运行的静态类型编程语言,被称之为 Android 世界的Swift,由 JetBrains 设计开发并开源。
Kotlin 可以编译成Java字节码,也可以编译成 JavaScript,方便在没有 JVM 的设备上运行。
在Google I/O 2017中,Google 宣布 Kotlin 成为 Android 官方开发语言
优势:
简洁: 大大减少样板代码的数量。
安全:避免空指针异常等整个类的错误。
互操作性: 充分利用 JVM、Android 和浏览器的现有库。
工具友好: 可用任何 Java IDE 或者使用命令行构建。
【类型自动推断;避免空指针闪退;支持协程和函数式编程等等】
模块
1、基础语法
2、基本数据类型
3、条件控制
4、循环控制
5、类和对象
6、继承
7、接口
8、数据类
9、范型
10、枚举类
11、对象表达式/声明
12、密封类
13、委托
一、基础语法
1、变量与常量
变量通过var关键字定义,常量通过val关键字定义.既支持类型推倒也支持显示声明类型.这样的话定义变量和常量写起来会比java简洁一些:
var varInt =1;//通过赋值可以自动推断出变量类型
var stringVar:String ="智慧培森"//显示声明变量类型
val STUDENT_ACTION ="UPDATA_STUDENT"//使用val关键字定义常量
2、类
kotlin 中通过class关键字定义类,支持在主构造函数中用var或者val直接定义成员变量:
类结构体中定义成员变量
3、数据类
在kotlin中我们可以用data class 定义单纯只是保存数据的数据类:
java中没有专门的数据类,通常是通过JavaBean来做数据类,但Kotlin中使用了专门的数据类。
Kotlin中数据类是只保存数据的类,类中的标准函数往往是从数据机械性推导而来的。
Kotlin可以创建只包含数据的类即数据类,数据类使用关键字data标记。
data class Person(var name: String,var age:Int)
4、object 对象
object 对象在多种情况下出现,但是它都遵循同一个理念,这个关键字定义一个类,并同是创建一个实例(类对象)
单例中的应用
kotlin 实现
对比java 实现
根据kotlin 的单例实现,查看字节码反编译后,写法和java 实现饿汉单例是一样的
Kotlin中类没有静态方法。如果你需要写一个可以无需用一个类的实例来调用,但需要访问类内部的函数(例如,工厂方法,单例等),你可以把该类声明为一个对象。该对象与其他语言的静态成员是类似的。学习更多
伴生对象
Kotlin 中,在类中定义的对象(object)声明,可使用companion修饰,这样此对象(object)就是伴生对象了。但是一个类(class)中最多只能定义一个伴生对象。
使用companion关键字修改的对象之后,伴生对象就相当于是外部类的对象,我们可以使用类直接调用
通过上面的看出来,类似于 Java 中使用类访问静态成员的语法。因为 Kotlin 取消了 static 关键字,所以 Kotlin 引入伴生对象来弥补没有静态成员的不足。可见,伴生对象的主要作用就是为其所在的外部类模拟静态成员。
5、函数定义
函数定义使用关键字 fun,参数格式为:参数 : 类型
表达式作为函数体,返回类型自动推断:
长参数:(类似java String... args)
6、字符串模板
${变量名}
7、NULL检查机制
kotlin 的空安全设计,对声明可以为空对变量,使用的时候要做空判断处理。
Kotlin将变量分为可以为Nullable类型 Non-Null类型,变量在声明时就要确定属于哪个阵营。
变量默认Non-Null类型,如果想声明Nullable的变量,需要用“?”修饰
声明Non-Null变量
声明Nullable变量
声明变量时若直接赋值,变量类型由赋值的类型决定
Non-null 类型变量不能赋值为null
如何把nullable 类型的变量赋值给non-null类型的变量,加!!
Nullable 变量使用,“?”符号使用
nullalbe 变量进行操作时,要加?,当变量为空时不会报错,返回null
“?:”符号使用。这个符号的作用是左边为空时,进行右边操作
二、基本数据类型
1、Kotlin 的基本数值类型包括 Byte、Short、Int、Long、Float、Double 等。不同于 Java 的是,字符不属于数值类型,是一个独立的数据类型。详情请看
取值范围
整数
浮点数
2、比较两个数
kotlin 中没有基础数据类型,只有封装的数字类型,每定义一个对象,kotlin 就帮我们封装了一个对象,这样可以保证不会出现空指针,所以比较两个数字的时候,就有比较两个数值大小和对象是否相等
3、数组
数组用Array 实现,并且还有一个size 属性和get、 set方法,[ ]重载了get 、 set 方法,所以可以通过下标很方便的获取或者设置对应位置的值
数组的两种创建方式:arrayof();工厂函数
三、条件循环
kotlin 条件控制
把 IF 表达式的结果赋值给一个变量。
使用区间
使用in运算符判断某个数字是否在某段区间内,区间格式x..y
四、循环控制
for 循环可以对任何提供迭代器(iterator)的对象进行遍历,语法如下:
for (item in collection) print(item)
如果你想要通过索引遍历一个数组或者一个 list,你可以这么做:
for (i in array.indices) {
print(array[i])
}
或者你可以用库函数 withIndex:
for ((index, value) in array.withIndex()) {
println("the element at $index is $value")
}
五、类和对象
1、Kotlin 类可以包含:构造函数和初始化代码块、函数、属性、内部类、对象声明。
Kotlin 中使用关键字class声明类,后面紧跟类名:
class Runoob {
// 类名为 Runoob // 大括号内是类体构成
}
2、属性定义
类的属性可以用关键字var声明为可变的,否则使用只读关键字val声明为不可变。
class Runoob {
var name: String = ……
var url: String = ……
var city: String = ……
}
3、使用构造函数创建类实例
val site = Runoob() // Kotlin 中没有 new 关键字
要使用一个属性,只要用名称引用它即可
site.name // 使用 . 号来引用
site.url
4、Koltin 中的类可以有一个 主构造器,以及一个或多个次构造器,主构造器是类头部的一部分,位于类名称之后:
class Person constructor(firstName: String) {}
如果主构造器没有任何注解,也没有任何可见度修饰符,那么constructor关键字可以省略。
class Person(firstName: String) {}
5、getter 和 setter
getter 和 setter 都是可选,val不允许设置setter函数,因为它是只读的。
Kotlin 中类不能有字段。提供了 Backing Fields(后端变量) 机制,备用字段使用field关键字声明,field 关键词只能用于属性的访问器