Kotlin学习笔记1
(学习教材为《第一行代码(第三版)》by郭霖)
1、Kotlin概述
Java虚拟机不关心class文件的编译来源,即只要是符合规格的class文件,Java虚拟机都可以识别,故而kotlin语言的原理就是将kotlin代码编译成class文件,随后再由Java虚拟机执行class文件。
相较于Java,kotlin语法更加简洁,有时候实现同样的功能kotlin所需的代码量会少很多;同时,kotlin的语法更加高级,大大提升开发效率;并且kotlin对于语言的安全性也有了更高的提升。并且,kotlin和Java是100%兼容的,可以直接调用java代码、使用Java开源库等等。
2、Kotlin中的变量
kotlin中声明变量的两个关键字:var和val。其中,var是可后期改变的变量(variable);val是在随后不可随意改变的变量(value),对应java中的final变量。
2.1 基本数据类型
kotlin拥有类型推导机制,例如如下代码:
fun main(){
val a=10
println("a="+a)
}
此时kotlin会自动推导出a是整形变量。如果给a赋值为“Kotlin”这个字符串的话,那么a就会被推导为字符串变量。
若想要主动对变量进行类型声明,只需要在变量后加上关键字即可,例如:
val a:Int = 10
注意:kotlin中的变量类型与java不同的是类型的首字母应该大写,例如Int、Long、Float、Double等,这是由于kotlin中的基本数据类型都是使用了对象数据类型,在kotlin中的Int是一个类,而在java中int只是一个关键字。
var变量则是可以被改变被重新赋值的变量。在上面的代码中,a变量为val变量,一旦被赋值便无法改变,如果想要吧a变量的数值扩大10倍,则必须将a由val变量改为var,如下:
fun main(){
var a:Int = 10
a = a*10
print(a)
}
此时运行代码可以得到正确的信息,否则,若是使用val变量则会报错”Val cannot be reassigned“,即val无法被重新赋值。
2.2 设置val变量的作用
val变量在Java中对应的是final关键字修饰的变量。而在java中,final关键字往往被程序编写者忽略,例如对于我来说,常常就只是定义一个简单的基本数据类型(例如int),随后就进行下面代码的编写,但是这样往往会发生之前定义的变量在某一处被修改的情况,而这并不是编写者的本意,而在大型项目、多人项目中这种情况更为常见。故而在kotlin中直接规定不可随意更改的变量必须用val定义。
3、kotlin中的函数
在kotlin中,定义函数的关键词是fun,即function,语法规则如下:
fun methodName(param1:Int,param2:Int):Int{
return 0
}
fun是定义函数的关键字,在kotlin中,无论是什么类型的函数都需要使用fun声明;methodName是函数名;括号内是函数需要传入的参数。并且制定了传入参数的基本数据类型;括号后代表返回值的基本数据类型,若是不需要返回值则可以不写;花括号包裹起来的部分就是函数的主体部分,包含了函数内的主要代码。
*kotlin语法简化
当函数中只有一行代码时,可以不用编写花括号内的函数体,而是直接将唯一的那一行代码跟在定义函数的尾部,例如一个简单的函数:
fun larger(num1:Int,num2:Int):Int{
return max(num1,num2)
}
这个函数可以直接简化为:
fun larger(num1:Int,num2:Int) = max(num1,num2)
由于返回值是int类型,所以可以直接省略函数声明时的Int,用等号来连接max的结果。
4、kotlin中的程序逻辑控制
4.1 条件语句
4.1.1 if语句
在kotlin中,if语句与java中的语句几乎类似,没有什么太大区别。将上述larger函数中调用的max函数进行展开就如下:
fun larger(num1:Int,num2:Int):Int{
var value = 0
if(num1>num2){
value = num1
}else{
value = num2
}
return value
}
而与java中的if不同的地方在于,kotlin中的if语句其实是有返回值的,返回值就是if语句每个条件中的最后一行代码的返回值。简化后代码如下:
fun larger(num1:Int,num2:Int):Int{
var value = if(num1>num2){
value = num1
}else{
value = num2
}
return value
}
结合上面的kotlin语法糖,这段代码还可以再次精简,精简有多种不同的形式,但核心思想还是上述的语法糖的内容,甚至可以精简成只有一行的代码:
fun larger(num1:Int,num2:Int) = if(num1>num2) num1 else num2
4.1.2 when条件
when条件有些类似switch语句,可以对不同的条件进行判断,并且不强制需要使用break关键字。使用例如下:
fun getScore(name:String) = when(name){
"Joey" -> 98
"Tian" -> 90
"Jegret" -> 90
"Kai" -> 93
else -> 0
}
使用方式同switch-case语句很相似,when语句的格式是匹配值 -> {执行逻辑}
,同时,when语句还可以进行类型匹配。例如:
fun check(num:Number){
when(num){
is Int -> print("Number is Int")
is Double -> print("Number is Duble")
else -> print("Not support")
}
}
代码中的is关键字就是类型匹配的关键字,类似于Java中的instanceof关键字。Number类是各个基本数字类型的父类。
4.2 循环语句
4.2.1 while循环
kotlin中的while循环与java的使用方法一致,不多加赘述
4.2.2 for循环
在Java中,for循环是for-i循环,而在kotlin中,for循环是for-in循环,用法如:
fun main(){
for(i in 0..10){
print(i)
}
}
这段代码就实现了打印从0-10的每个数字。其中,”…“是创建两端闭区间关键字,在…的两边指定区间的左右端点就可以创建一个闭区间。
而until关键字生成的是一个左闭右开的区间,这样的好处是,一般长度为10的数组下标区间是0-9,所以这个时候就不需要我们取到10的值,故而只要将[0-10]区间改为[0-10)即可。如果想要实现跳步读取(打印)只需要添加step关键字即可,这样就可以跳过指定长度的一些元素。
fun main(){
for(i in 0 until 10 step 2){
print(i)
}
}
这段代码打印出的结果就是0 2 4 6 8,相当于for-i循环中的i=i+2的效果。