欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

快速入门Kotlin编程

程序员文章站 2022-03-10 22:09:38
...

快速入门Kotlin编程

可能大多数人对Kotlin语言并不是很了解,或者至今还未听说过,但其实它并不是一门很新的语言。
Kotlin是由JetBrains公司开发与设计的
早在2011年,JetBrains就公布了Kotlin的第一个版本
并在2012年将其开源,但在早期它并没有受到太多的关注
2016年,Kotlin发布了1.0正式版本,这代表着Kotlin已经足够成熟和稳定,并在JetBrains也在自家的旗舰开发工具IntelliJIDEA中加入了对Kotlin的支持。
然后在2017年Google宣布Kotlin正式成为Android的一级开发语言,Android Studio中也加入了对Kotlin的支持,Kotlin才逐渐受到广泛的关注。
快速入门Kotlin编程

在Android系统诞生的前9年时间里,Google都只提供了Java这一门语言来开发Android应用系统,虽然在Android1.5系统中Google引入了NDK功能,支持使用C/C++语言来进行一些本地化开发,但是这丝毫没有影响过Java的正统地位。
不过从2017年开始,一切都发生了改变,Google在2017年的I/O大会上宣布,Kotlin正式成为Android的一级开发语言,和Java平起平坐,Android Studio也对Kotlin进行了全面的支持。两年之后,Google 又在2019年的I/O大会上宣布,Kotlin已经成为Android的第一开发语言,虽然Java仍可继续使用,但Google更加推荐开发者使用Kotlin来编写Android的应用程序,并且未来提供的官方API也将优先考虑Kotlin版本

如今Kotlin在Android开发中的发展速度可谓是势如破竹,那么我们接下来就了解一下Kotlin吧。

一、Kotlin运行环境

Kotlin和Java语言一样是将编辑的代码进行编译成class文件然后运行在java虚拟机上的。
Kotlin的语法更加简洁、更加高级。使用Kotlin开发的工程代码量可能会比使用Java开发的减少百分之50,并且Kotlin中增加了很多现代高级语言的语法特性,使得开发效率大大提升,另外Kotlin在安全性方面下了很多功夫,几乎杜绝了空指针这个全球崩溃率最高的异常。
Kotlin在拥有众多出色的特性之外,还有一个最为重要的特性,那就是它和Java是100%兼容的。Kotlin中可以直接调用使用Java编写的代码,也可以无缝使用Java第三方开源库,这使得Kotlin在加入了诸多特性的同时还继承了Java的全部财富。

在了解了Kotlin的运行环境以及与Java的联系后,我们怎么来运行Kotlin代码呢
有以下三种方式:

  • 使用我们前面提到的IntelliJIDEA,在IDEA中创建一个Kotlin项目,就可以独立运行Kotlin代码了。
  • 在线运行Kotlin代码,JetBrains专门提供了一个在线运行Kotlin代码的网站:https://try.kotlinlang.org/,国内可以龟速访问……
  • 使用Android Studio,但是Android Studio是一个专门的Android应用程序的开发工具,不能独立创建Kotlin项目,但是我们在Android项目中编写一个Kotlin的main()函数就可以独立运行Kotlin代码了

如下:在Android项目HelloWorld中创建Kotlin文件LearnKotlin,在example下new Kotlin File/Class
快速入门Kotlin编程
在Kotlin文件中编写main()函数,并独立运行Kotlin程序快速入门Kotlin编程

二、Kotlin的变量与函数

变量:
Kotlin中定义变量时,只允许在变量前声明两种关键字:val和var

  • val(value)用来声明一个不可变的变量,在初始赋值之后就再也不能重新赋值,对应Java中的final变量
  • var(variable)用来声明一个可变的变量,对应Java中的非final变量
    Kotlin具有出色的推导机制,可以根据我们书写的代码自动推导变量类型

如下代码,使用var关键字定义变量a,并将其赋值为10,这里a就会被自动推导成整型变量,注意在a被推导为整型后,可以将a的值修改为其他的整型数值,但是不能将变数(variable)a的值修改为其他类型的值。使用val定义变量b并为其赋值为"tianjinkejidaxue",则b被推导为字符串类型,且由于我们使用val来定义b,则b的值不能被修改,就是修改为同类型的其他数值也不可以

fun main(){
    var a = 10                  // 定义变量a,并赋值10,则a就被推导为整型变量
    a = 20                      // 可以将a修改为其他整型数值
//    a = "天津科技大学"         // a已经是整型变量了,在为其赋值字符串,就会出错
    println("a = " + a)         // 运行结果:a = 10
    val b = "tianjinkejidaxue"  // b被推导为字符串类型
//    b = "tust"                  // Val cannot be reassigned     b是val,不可以修改它的值
    println("b = " + b)         // 运行结果:b = tianjinkejidaxue
}

注意:Kotlin中的每行代码的结尾不用加分号

此外我们还可以在定义变量的时候显式声明数据的类型:

var a: Int = 10			// 定义的时候显示声明变量的数据类型

此时细心的你一定会发现,我们这里显式声明整型时使用的是Int而不是java中的基本数据类型int。其实这是因为Kotlin完全抛弃了Java中的基本数据类型,全部使用了自己的对象数据类型,在Kotlin中Int等其他对象数据类型是一个类,拥有自己的方法和继承结构。
其他的一些对象数据类型和Java的基本数据类型比照见下表:

Java基本数据类型 Kotlin对象数据类型 数据类型说明
int Int 整型
long Long 长整型
short Short 短整型
float Float 单精度浮点型
double Double 双精度浮点型
boolean Boolean 布尔型
char Char 字符型
byte Byte 字节型

Kotlin中val变量的设计是为了解决Java中final关键字没有被合理使用的问题,相信很多学习编程的同学在自己编写Java代码时基本不会主动为那些不需要后续修改值的变量声明final的。其实一个良好的编程习惯应该是:除非一个变量明确允许被修改,否则都应该加上final关键字这时因为当项目越来越复杂时,参与进来的人越来越多时,你永远不知道一个可变的变量在什么地方被修改了,即使它原本不应该被修改。所以Kotlin这一设计就能够很好的提醒我们在定义变量时思考一下是将其定义成var(可变)还是val(不可变)呢
一个诀窍:永远优先使用val来声明一个变量,而当val没有办法满足自己的需求时再使用var

函数:

函数和方法:函数(function)和方法(method)是同一个东西,没有什么区别,只是不用语言的习惯叫法不一样而已,Java中使用方法更普遍,而Kotlin中使用函数更普遍

学习C语言时我们就知道函数三要素:函数类型(函数返回值的类型)、函数名、参数列表
Kotlin也是如此,Kotlin中有一个特别的函数main(),它是程序的入口。其他普通的函数的格式为:

fun functionName(param1: Int,param2: Int): Int{
    return 0
}

其中最前面的fun是定义函数的关键字,表示接下来定义了一个函数
接着是函数名称
然后括号中的是参数列表,可以有0到多个
最后括号后面的: Int表示的是返回值的类型,如果没有返回值可以直接省去

自定义函数使用示例:

import kotlin.math.max		// 导包

fun main(){
    val a = 37
    val b = 40
    val value = largerNumber(a,b)
    println("larger number is "+value)
}

fun largerNumber(num1: Int,num2: Int): Int{
    return max(num1,num2)       // 函数中调用Kotlin的内置函数max()
}

三、控制逻辑

程序三大逻辑结构:顺序结构、条件结构、循环结构
顺序结构就不用提了,我们这里需要提的是条件结构和循环结构,Kotlin语法更加高级,对这两种结构做了一些功能的增强,我们需要特别注意一下。

3.1 条件语句

Kotlin中条件语句有if和when两种,分别对应着Java中的if和switch

if语句
Kotlin中的if语句相比较Java有一个额外的功能,它是可以有返回值的,返回值就是if语句每个条件中最后一行代码的返回值。看下面函数即可以实现求两数较大者

fun largerNumber(num1: Int, num2: Int): Int {
    return if (num1 > num2) {
        num1
    } else {
        num2
    }
}

这一代码书写相比较我们之前Java条件语句的书写更加简洁,但其实我们还可以进一步精简,利用语法糖的概念,我们可以进一步精简:

fun largerNumber(num1: Int, num2: Int) = if (num1 > num2) {
    num1
} else {
    num2
}

调整,继续见精简:

fun largerNumber(num1: Int, num2: Int) = if (num1 > num2) num1 else num2

when语句
if语句实现输入姓名,返回考试分数:

fun getScore(name: String) = if(name == "Tom"){
    86
}else if (name == "Jim"){
    77
}else if(name == "Jack"){
    95
}else if(name=="Lily"){
    100
}else {
    0
}

我们发现使用if语句比较繁琐,这时我们需要使用when来替换,如下:

fun getScore(name: String) = when (name) {
    "Tom" -> 86
    "Jim" -> 77
    "Jack" -> 95
    "Lily" -> 100
    else -> 0
}

when语句和if语句一样可以有返回值,此外when语句允许传入任意类型的参数,然后在when结构体中定义一系列的条件。
格式:
匹配值 -> { 执行逻辑 }
当执行逻辑只有一行代码时{}可以省略
when除了可以进行精准匹配,还可以进行类型匹配,见下代码:

fun checkNumber(num: Number) {
    when (num) {
        is Int -> println("number is Int")
        is Double -> println("number is Double")
        else -> println("number not support")
    }
}

这里的is相当于Java中的instanceof关键字
when还可以不带参数使用:

fun getScore(name: String) = when{
    name.startsWith("Tom")  -> 86       // 以Tom开头的名字分数都为86
    name == "Jim" -> 77
    name == "Jack" -> 95
    name == "Lily" -> 100
    else -> 0
}

3.2 循环语句

Kotlin中的循环语句有while和for,其中while语句和Java、C、C++中的while使用一样,而Kotlin中的for语句却有着很大的不同
Java中的for-i被Kotlin舍弃了,而Java中的for-each被Kotlin进行了大幅度的加强,变成了for-in。
区间的概念:

// 闭区间[0,10]
val range1 = 0..10
// 左闭右开[0,10)
val range2 = 0 until 10
// 自定义步长 0 2 4 6 8 
val range3 = 0 until 10 step 2
// 降序 [10,1]		downTo可以结合step等使用
val range4 = 10 downTo 1

for-in的使用:

fun main() {
    for (i in 0 until 10 step 2) {
        println(i)
    }
}
相关标签: kotlin Android