系列文章全部为本人的学习笔记,若有任何不妥之处,随时欢迎拍砖指正。如果你觉得我的文章对你有用,欢迎关注我,我们一起学习进步!
Kotlin学习笔记(1)- 环境配置
Kotlin学习笔记(2)- 空安全
Kotlin学习笔记(3)- 语法
Kotlin学习笔记(4)- 流程控制
Kotlin学习笔记(5)- 类
Kotlin学习笔记(6)- 属性
Kotlin学习笔记(7)- 接口
Kotlin学习笔记(8)- 扩展
Kotlin学习笔记(8)- 扩展(续)
Kotlin学习笔记(9)- 数据类
Kotlin学习笔记(10)- 泛型
Kotlin学习笔记(11)- 内部类和嵌套类
Kotlin学习笔记(12)- 委托
Kotlin学习笔记(13)- 函数式编程
Kotlin学习笔记(14)- lambda
一、基础语法
在语句的结尾不用加
;
声明一个方法需要加关键字
fun
如果函数是重载父类的方法,则需要加
override
关键字方法中的参数格式为:形参名+冒号+形参类型
fun a (str : String, num : Int)
二、定义类
kotlin默认唯一构造器,暨类定义同时也是构造器
class Person(name : String, age : int) { init{ // do some thing } } 翻译成java为: final public class Person { public Person(String name, int age){ init(); } private void init(){ // do some thing } }
仔细看会发现,翻译成的java类定义前面有
final
修饰符,因为在kotlin中类默认为final
的,也就是不可继承的。如果要继承,需要声明为open
,或者abstract
。open class Person(name : String, age : int) { init{ // do some thing } }
如果
init
中没有操作,则可以省略class Person(name : String, age : int)
如果连参数也没有,甚至可以这么写
class Person
三、定义函数方法
函数方法要加
fun
关键字,方法的返回类型写在参数后fun sum (a : Int, b : Int) : Int { return a+b }
如果像上面这样,函数内只有一条语句,则可以直接赋值
fun sum (a : Int, b : Int) : Int = a+b
kotlin编译器会自动根据返回值推测方法返回类型
fun sum (a : Int, b : Int) = a+b
如果方法需要返回值,则返回
Unit
,类似java中的void
,当然Unit
也是可以忽略的fun printSum (a : Int, b : Int) : Unit = print(sum(a, b)) //等价于 fun printSum (a : Int, b : Int) = print(sum(a, b))
看到网上资料说,如果方法是
public
的,则必须要声明返回类型。但是我自己试验发现kotlin的方法默认是public的,同时上面说的几点都适用,也就是不是必须要明确声明返回类型。如有错误之处,欢迎随时拍砖指正。
四、定义变量
kotlin中将java中的变量演化成了两种:var
表示变量,val
便是常量(相当于java中用final
修饰)
var a : Int = 1 // 定义一个普通变量
var b = 2 // 和方法的返回类型一样,编译器也会根据值自动判断变量类型
b = 3 // 普通变量可多次赋值
val c = 1 // 定义一个常量,和普通变量一样,编译器也会自动判断类型
c = 2 // 提示编译错误,无法运行。常量只能赋值一次
val d : Int // 如果常量在定义的时候没有赋值,则必须明确类型
d = 1 // 赋值
五、使用泛型Array代替数组
例如最经典的main
方法
Java:
public static void main(String[] args){
// do some thing
}
Kotlin:
fun main(args : Array<String>){
// do some thing
}
六、条件语句
fun max(a: Int, b: Int): Int {
if (a > b)
return a
else
return b
}
//或者也可以把if语句作为省略方法体的方法
fun max(a: Int, b: Int) = if (a > b) a else b
七、空值
在类型后面跟一个问号?
表示可能为空,跟双感叹号!!
表示一定不能为空。具体的请看我上一篇文章<a herf=”http://www.jianshu.com/p/6063dee97eca”>《Kotlin学习笔记(2)- 空指针》</a>。
八、类型检测并自动转换
fun getStringLength (obj : Any) : Int? {
// 通过is关键字做类型判断
if(obj is String){
// 类型判断后,系统自动转型,这里自动将obj转为String类型
return obj.length
}
// 类型判断之外,obj依然是Any类型,没有被转型,所以不能调用length,会报编译错误
var length = obj.length
return null
}
fun getStringLength (obj : Any) : Int? {
// 通过is关键字做类型判断,因为第一个判断条件已经通过并自动转型,
// 所以第二个判断时obj可以直接作为String类型使用
if(obj is String && obj.length > 0){
// 类型判断后,系统自动转型,这里自动将obj转为String类型
return obj.length
}
return null
}
九、循环
for
循环,使用in
关键字fun main(args : Array<String>) { for(arg in args) print(arg) for(i in args.indices) print(args[i]) for((index, value) in args.withIndex()){ println("index : $index, value : $value") } }
while
循环,和java的基本一致fun main(args : Array<String>) { var i = 0 while (i < args.size){ print(args[i++]) } var j = 0 do{ print(args[j]) }while (++j<args.size) }
十、when
表达式(类似于java中的switch
)
when
的特性与switch
差不多,都是通过列举比对列举出来的条件进行匹配,满足条件的分支会被执行。when
可以作为表达式,也可以作为声明。如果用作表达式的话,那么满足条件的分支就是总表达式。如果用做声明,不满足条件的分支的的的值会被忽略,只保留满足条件的分支,而且返回的值也是最后一个表达式的值。
传统用法
var x = 3 when (x) { 1 -> print(1) 2 -> print(2) else -> print(5) }
作为表达式,满足条件的分支会被作为
when
的返回值var x = 3 var result = when (x) { 1 -> 1 2 -> 2 else -> 5 }
分支条件一致,如果有分支可以用同样的方式处理的话, 分支条件可以连在一起处理。
when (x) { 0,1 -> print("x == 0 or x == 1") else -> print("otherwise") }
使用任意表达式作为分支的条件
when (x) { parseInt(s) -> print("s encode x") else -> print("s does not encode x") } when (x) { in 1..10 -> print("x is in the range") in validNumbers -> print("x is valid") !in 10..20 -> print("x is outside the range") else -> print("none of the above") }