- 声明要素
- 变量
- 分类
- 可变变量
- val关键字声明
- 说明
- 只能初始化一次
- Kotlin推荐使用val
- 对应Java的final变量
- 示例
- val answer: Int = 42
- val answer = 42 (类型推导,省略变量类型)
- 说明
- val关键字声明
- 不可变变量
- var关键字声明
- 说明
- 可初始化多次
- 对应Java的非final变量
- 说明
- var关键字声明
- 可变变量
- 初始化
- 有初始化器
val answer = 42 (42就是初始化器,可省略变量类型) - 没有初始化器
val answer: Int (变量类型不可省略)
ansewer = 42
- 有初始化器
- 分类
- 函数
- 说明
- 使用fun关键字声明一个函数
- 参数名写在参数类型前面,并用“: ”分割
- 函数返回类型放在参数列表后,并用“: ”分割
- 函数可不放在类中(可与类同级)
- 标准库函数包装,简化开发
- 示例
- println
- 示例
- 可省略每行语句结尾分号
- 函数返回值支持表达式函数体
- 说明
- 函数体是由单个表达式构成
- 可用表达式作为完整函数体,并省略返回类型,花括号和return语句
- 示例
- 示例
- 只有表达式体函数的返回类型可省略(类型推导)
- 说明
- 示例
- 说明
- 字符串
- 字符串模板
- 说明
- 在变量或表达式前加"$"
- 类似于Java字符串拼接"+"
- 示例
- 说明
- 字符串模板
- 类
- 数组
- 数组就是类(Array)
- 类的修饰符
- 说明
- 在Kotlin中,默认public,可省略
- 说明
- JavaBean
- 说明
- 在Java中,JavaBean字段xx有访问器setxx,getxx
- 在Kotlin中,使用值对象表示
class Person(val name: String)
这就是一个JavaBean,是不是很简单?
底层实现和Java一样的
- 说明
- 对象
- Kotlin中创建对象时,不需要new
var person = Person("Bob", true)
- Kotlin中创建对象时,不需要new
- 属性
- 说明
- 在Java中,字段和其访问器的组合称为属性
- 在Kotlin中,属性是头等语言特性,完全代替了字段和访问器
- 在类中使用val/var声明一个属性
class Person (val name: String, var isMarried: Boolean) - val声明的属性是只读的,var声明的属性是可读写的
只读属性有一个getter方法,可读写属性既有getter也有setter
- 在类中使用val/var声明一个属性
- 在Kotlin中,可直接访问属性,不需调用setter/getter
- 在Java中定义的JavaBean,在Kotlin中依然可使用属性语法
- 说明
- 访问器
- 说明
- 当你声明属性的时候,你就声明了对应的访问器
- val对应只读访问器,var对应可读写访问器
- 自定义访问器
- 说明
- 大多数情况下,属性有一个对应的字段保存属性值
- 如果这个值可即时计算(不需单独字段存储),可自定义一个属性访问器
- 在Java中访问这个属性值,调用isSquare()方法
- 在Kotlin中访问这个属性值,使用 rectangle.isSquare
- 说明
- 说明
- 包的导入
- 包
- 说明
- 每个Kotlin文件都有其package
- Kotlin可导入类和顶层函数
- 属于相同package的文件中所有声明(类,函数,属性)可互相使用
- 包名称后加 “ .* ”来导入指定包中定义的所有声明
- 不仅让包中定义的类可见,也可让顶层函数和属性可见
- 属于不同package的文件中所有声明(类,函数,属性)使用时需要导入
- 说明
- 包
- 数组
- 枚举
- 声明简单的枚举类
- 说明
- Java中使用enum一个关键字声明枚举
- Kotlin中使用了enum class两个关键字声明枚举
- 示例
- 说明
- 声明带属性的枚举类
- 说明
- 当你声明每个枚举常量的时候,必须提供该常量的属性值
- 如果要在枚举类中定义任何方法,就要使用“分号”把枚举常量列表和方法定义分开
- 示例
- 说明
- 声明简单的枚举类
- 变量
- 智能转换
- 说明
- 在Kotlin中,使用“is”关键字检查判断变量属于某种类型
- is检查和Java中的instanceOf相似
- 如果检查过一个变量类型,后面使用此变量时不需要做显示转换
- 编译器为你执行了类型转换(这种行为称为智能转换)
- 如果没有使用智能转换,使用“as”关键字进行某种类型的显示转换
- 说明
- 控制结构
- if ... else
- when
- 循环迭代
- while
- Kotlin中的while,do...while与Java中的没有区别
- for
- 迭代区间或集合
- 说明
- 区间
- 区间本质上是两个值之间的间隔
- 使用“ .. ”运算符来表示区间
- “..”运算符不仅可创建数字区间,也可创建字符区间
- 区间也不仅局限于数字和字符
- 支持实例比较操作的任意类都可
实现了Compareable接口
- 支持实例比较操作的任意类都可
- Kotlin的区间是包含或者闭合的
- 如果区间是闭合的,那么这个区间被称作数列
- 数列示例
val oneToTne = 1..10 - 半闭合的区间 [ )
- 不包含区间的结束值
- 使用until函数创建半闭合区间
- 示例
for (x in 0 until size)
等同于
for(x in 0..size-1)
- 使用关键字“in”来迭代区间或者集合
- 区间
- 说明
- 迭代集合
- 迭代map
- 示例
- 示例
- 迭代集合同时跟踪当前项下标
- 示例
- 示例
- 迭代map
- 使用“in”检查集合和区间成员(返回Boolean)
- 说明
- 可使用它的逆运算“!in”检查这个值是否不在区间中
- in运算符和!in也适用于when表达式
- 示例
- 说明
- 迭代区间或集合
- while
- 函数表达式
- if表达式
- 说明
- 在Java中,所有控制结构都是语句
- kotlin中,除了循环(for/do/do while)外的控制结构都是表达式
- 语句和表达式区别:
- 表达式有自己的值,而语句没有
- 说明
- when表达式【特别强大】
//when表达式
//when取代了类C语言的switch操作符,最简单形式如下
when(max){
1 -> println("max==1")
3 -> println("max==3")
else ->{
println ("neither 1 nor 3")
}
}
//如果很多分⽀需要⽤相同的⽅式处理,则可以把多个分⽀条件放在⼀起,⽤逗号分隔:
when (max) {
0, 1 -> println("x == 0 or x == 1")
else -> println("otherwise")
}
//我们可以⽤任意表达式(⽽不只是常量)作为分⽀条件
when (max) {
parseInt("3") -> println("s encodes x")
else -> println("s does not encode x")
}
//我们也可以检测⼀个值在(in)或者不在(!in)⼀个区间或者集合中:
val validNumbers = arrayOf(1,2,3)
when (max) {
in 4..10 -> println("x is in the range")
in validNumbers -> println("x is valid")
!in 10..20 -> println("x is outside the range")
else -> println("none of the above")
}
println(hasPrefix("prefix_abc"))
/**
* when 也可以⽤来取代 if-else if链。
* 如果不提供参数,所有的分⽀条件都是简单的布尔表达式,
* ⽽当⼀个分⽀的条件为真时则执⾏该分⽀:
*/
val str = "abc"
when {
str.startsWith("a") -> print("aaa")
str.startsWith("b") -> print("bbb")
else -> print("str is funny")
}
- if表达式
- 异常处理
- 说明
- Kotlin中异常处理语句的基本形式和Java类似
- Kotlin中不区分受检查异常和未受检查异常
- 因此,不用声明函数抛出的异常
- 可以处理也可不处理异常
- Kotlin中throw结构是一个表达式
- Kotlin中try结构是一个表达式
- 类似Java7中的try-with-resources
- 无需写finally释放资源的代码
- 如果try代码块执行正常,代码块中最后一个表达式就是结果
- 如果捕获到了异常,catch代码块中最后一个表达式就是结果
- 说明