Kotlin 变量、函数、程序的逻辑控制以及循环

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的作用一样,在KotlinInt、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)
        }
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,406评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,732评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,711评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,380评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,432评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,301评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,145评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,008评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,443评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,649评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,795评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,501评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,119评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,731评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,865评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,899评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,724评论 2 354