1、Kotlin的原理
编程语言大致可以分为二类:
- 1、编译型语言
编译型语言的特点是:编译器将我们编写的代码一次性编译成计算机可识别的二进制文件,然后计算机直接执行,像C和C++都属于编译型语言。 - 2、解释型语言
解释型语言的特点是:在程序运行时,解释器一行行读取我们编写的源代码,然后将其转换成计算机可识别的二进制数据后再执行,因此效率较低,如Python、JavaScript、Java等都属于解释型语言。
Java编译之后生成的class文件,并不是计算机识别的二进制文件,所以这就需要Java虚拟机充当解释器的作用,将class文件转成二进制文件。
如果有一种新的语言也能编译生成和Java相同规格的class文件,那么这个新语言是不是也能开发Android程序,答案是肯定的,这也就是Kotlin的工作原理。
2、Kotlin的优点
- 1、Kotlin比较简洁,开发相同的功能,相比于Java能减少50%的代码量,甚至更多。
- 2、Kotlin更加高级,Kotlin增加了现代高级语言的语法特性,提高了开发的效率。
- 3、Kotlin在安全性上做了很多的努力,几乎杜绝了空指针异常。
- 4、和Java是100%兼容。
3、变量
Kotlin中定义变量,只允许在变量前声明两种关键字:
- 1、val:用来声明一个不可变的变量,这种变量在初始赋值之后就不能再重新赋值,对应java中的final变量。
- 2、var:用来声明一个可变的变量,这种变量在赋值之后仍然可以重新赋值,对应java中的非final变量。
举个例子
fun main(){
val a=10
}
看到这里很多人肯定会有疑问:变量的类型该怎么定义呢?
3.1、Kotlin类型推导机制
对于Kotlin来说,它是不需要显式的定义变量的类型,因为Kotlin拥有出色的类型推导机制
,比如上面的例子中val a=10
那么a
的类型就是整型变量
,如果把一个字符串赋值给a
那么a
就是字符串变量
。
如果开发者不想相信类型推导机制,也可以显式的定义变量的类型:
val a:Int=10
在上面,我们显式的指定整型变量为Int
,这和java还是有区别的,在java中我们会使用关键字int
,它们还是有区别的。在Kotlin中Int不再是关键字而是一个类,它拥有自己的方法和继承结构。
3.2、Java和Kotlin数据类型对照表
Java基本数据类型 | Kotlin对象数据类型 | 数据类型说明 |
---|---|---|
int | Int | 整型 |
long | Long | 长整型 |
short | Short | 短整型 |
float | Float | 单精度浮点型 |
double | Double | 双精度浮点型 |
boolean | Boolean | 布尔型 |
char | Char | 字符型 |
byte | Byte | 字节型 |
4、函数
先看下Kotlin中函数的标准定义规则:
fun function_name( param1 : Int , param2 : Int ) : Int {}
- 1、
fun
是定义函数的关键字,无论定义什么函数,都必须使用fun
来声明函数。 - 2、紧跟着
fun
后面的就是方法名(可随意编写) - 3、括号里面的是参数,
param1
表示参数名,后面跟 参数的类型,参数个数不限。 - 4、括号后的
: Int
表示返回值类型,如果无返回值可不写 - 5、大括号里的内容是方法体。
举例如下:
fun main(){
val a=10
val b=100
val result=getLargeNumber(a,b)
println("输出的结果是:result="+result)
}
fun getLargeNumber(num1:Int,num2:Int) : Int{
return max(num1,num2)
}
如果方法体中只有一行代码的话:简化方法getLargeNumber
fun getLargeNumber(num1:Int,num2:Int) : Int=max(num1,num2)
由于其出色的类型推导机制,函数max
的返回值为整型,继续简化如下:
fun getLargeNumber(num1:Int,num2:Int) =max(num1,num2)
5、程序的逻辑控制
程序的执行语句主要分为3种:
- 1、顺序语句
- 2、条件语句
- 3、循环语句
顺序语句没什么好说的,就是一行一行的执行。
5.1、条件语句
Kotlin中实现条件语句的方法有两种:if和when
5.1.1 使用if实现条件语句
Kotlin中的if
的用法和Java中几乎没有什么区别。
fun getLargeNumber(num1:Int,num2:Int) : Int {
var result:Int
if(num1>=num2){
result=num1
}else{
result=num2
}
return result
}
Kotlin中的if相比于Java有一个额外的功能:它是可以有返回值的。返回值就是if条件语句每一个条件中最后一行代码的返回值。
上面例子可简化为
fun getLargeNumber(num1: Int, num2: Int): Int {
return if (num1 >= num2) {
num1
} else {
num2
}
}
上面说过,方法体中只有一行代码的简化,可继续简化为一行代码
fun getLargeNumber(num1: Int, num2: Int) = if (num1 >= num2) num1 else num2
5.1.2、when条件语句
Kotlin中的when类似于Java中的switch,但是比switch强大了很多,在java中switch只能传入整形、字符串、枚举或短于整形的变量作为条件,相比来说when就比较强大了,可以传入任意类型的值。
先看一个用if
实现的简单例子
fun getScore(name: String) = if (name == "Tom") {
88
} else if (name == "LiLi") {
90
} else {
100
}
1、精确匹配
再看下用when
如何实现相同的功能
fun getScoreByWhen(name: String) =
when (name) {
"Tom" -> {
Log.e("TAG","when的每一个条件的最后一句的返回值,也可以作为返回值和if一样")
88
}
"LiLi" -> 90
else -> 100
}
可以看到when也是有返回值的,每一个条件的最后一句来作为返回值,和if的使用是一样的。
when允许传入一个任意类型的参数,when中结构体的标准格式是
匹配值 -> {执行逻辑}
2、类型匹配
when除了上面的精确匹配外
还有类型匹配
,看个例子
fun checkNum(number: Number) {
when (number) {
is Float -> Log.e("TAG", "传入的是Float类型")
is Double -> Log.e("TAG", "传入的是Double类型")
is Int -> Log.e("TAG", "传入的是Int类型")
}
}
其中is
关键字是类型匹配的核心
,和Java中的instanceof
的作用一样,在Kotlin
中Int、Float、Double等数字相关的类都是其子类。
3、不带参数匹配
when
除了上面的用法外,还有一种不带参数的匹配方式
fun noParamWhen(name: String) = when {
name == "Tom" -> 88
name == "LiLi" -> 90
else -> 100
}
这种写法看着有点麻烦,其实它还是有存在的意义的,下面举例说明
fun noParamWhen(name: String) = when {
name.startsWith("Tom") -> 88
name == "LiLi" -> 90
else -> 100
}
想实现上面这种功能的话就不能使用带参数的方式来实现。
6、循环语句
Java中主要有2中循环:while循环和for循环,在Kotlin中也提供了while循环和for循环,其中Kotlin中的while循环和Java中没什么区别,所以这里只需要学习下for循环的使用。
Kotlin中摒弃了Java的for-i
循环,并将Java中的for-each
循环修改成了for-in
循环,先看下for-in
循环的使用。
fun forCircle() {
for(i in 0 .. 10){
Log.e("TAG", "for-in循环::"+i)
}
}
..是定义区间的关键字,0 .. 10就表示区间为[0,10],可以看到这个区间是左闭右闭的,如何表示左闭右开呢?这就用到了until
关键字
fun forCircle2(){
for(i in 0 until 10){
Log.e("TAG", "for-in循环,区间是左闭右开:"+i)
}
}
上面两个例子循环的步长都是1,那么如何修改步长呢?这就需要使用关键字step
fun forCircle3(){
for(i in 0 .. 10 step 5){
Log.e("TAG", "for-in循环,步长为5:"+i)
}
}
上面的例子都是升序的,如何实现降序呢?使用关键字downTo
即可实现
fun forCircle4(){
for(i in 10 downTo 0 ){
Log.e("TAG", "for-in循环,降序:"+i)
}
}
网友评论