kotlin基础
变量
-
在kotlin中if 是表达式;Java中赋值操作是表达式,而在kotlin中变成了语句
- 表达式和语句区别:表达式是有值的,并且能作为另一个表达式得一部分使用
-
kotlin中声明变量以关键字开始,然后是变量名称,最后可以加上类型
-
关键字:val--表示不可变引用,对应java中的
final
var--表示可变引用
- 注意:val引用自身时不变的,但是它指向的对象可能是可变的。
- 如果不指定变量类型,编译器会分析初始化器表达式的值,并把它作为变量的类型,如果没有初始化器,则需要显式地指定它的类型
-
-
字符串模板:或者用${}包围一个表达式
fun main(args: Array
) { println("Hello, ${if (args.size > 0) args[0] else "someone"}!")}复制代码
函数
-
用关键字
fun
来声明函数 -
可以定义在文件最外层,不必放入类中
-
表达式函数体:如果一个函数体是由单个表达式构成,可以用这个表达式作为一个完整的函数体
例如:对如下
-
//代码体块fun max(a: Int, b: Int): Int { return if (a > b) a else b}复制代码
-
//表达式函数体fun max(a: Int, b: Int):Int = if (a > b) a else b复制代码
-
//表达式函数体+类型推导fun max(a: Int, b: Int) = if (a > b) a else b复制代码
类
-
数组就是类
-
只有数据没有代码的对象叫做
值对象
-
属性:
- 当声明属性的时候,你就声明了对应的访问器(只读属性只有一个getter,而可写属性既有getter又有setter).
- 在kotlin中,可以直接访问属性,比如
person.isMarried = false
实际调用的是setter
-
自定义访问器
class Rectangle(val height: Int, val width: Int) { val isSquare: Boolean get() { return height == width }}复制代码
-
标记类实现接口,例如:
class Num(val value: Int) : Expr复制代码
控制结构
-
枚举类和"when"
when
类似于java中的switch但功能更加强大
-
if
和when
都可以使用代码块作为分支体,在这种情况下,代码块中的最后一个表达式就是结果 -
for循环和in
-
区间:本质上是两个值之间的间隔,一个起始值,一个结束值用
..
来表示区间-
Kotlin中区间是闭合的,这就意味这第二个值始终是区间的一部分
-
//从100开始倒着计数并且只记偶数for (i in 100 downTo 1 step 2) { print(fizzBuzz(i))}复制代码
-
使用
until
来表示不包含指定结束值得半闭合区间
-
-
迭代
map
-
//letter代表key, binary代表value, binaryReps代表Mapfor ((letter, binary) in binaryReps) { println("$letter = $binary")}复制代码
-
可以使用
map[key] = value
来设置读取值,binaryReps[c] = binary
等价于binaryReps.put(c, binary)
-
用
withIndex()
在迭代集合时追踪当前项的下标,不需要创建一个单独的变量来存储下标并手动增加他:val list = arrayListOf("1", "11", "111")for ((index, element) in list.withIndex()) { printlin("$index: $element")}复制代码
-
-
-
使用
in
来检查集合和区间的成员in
运算符来检查一个值是否在区间中,!n
检查这个值是否不在区间中
智能转换
is
检查和java中的instanceOf
相似,在检查过变量具有某种类型之后不必再显式地转换它的类型:编译器使用智能转换as
关键字来表示到特定类型的显示转换
异常处理
- 不必用
new
关键字来创建异常实例 throw
结构是一个表达式,能作为另一个表达式的一部分使用- kotlin并不区分受检异常和未受检异常,不用指定函数抛出异常,同时也可以处理也可以不处理异常
ps:本文参考自:《kotlin实战》
以后每一周会坚持更新一篇读书笔记