Kotlin简略笔记

  最近报了一个“大创”[1]项目,需要开发一个app,所以有了学习Android程序开发的必要,自己的话也是很早就想学了,但一直懒,耽误了。

一、变量和函数

  每门语言的基础都是其变量与函数。Kotlin的变量类型和其它语言基本一致,有Int,String,Long等。但与其它诸如C、Java语言不同的是,Kotlin完全抛弃了基本变量类型,也就是说这里的Int、Long等都是类,这也是它们首字母大写的原因。
  与Java的另一个不同则是,Kotlin再申明变量时并不需要显式地指明变量的类型,只需要采用val/var来说明变量是可改变/不可改变的即可。

fun main(){
    val a=10
    var b:Int=10
    b=b+10
    println("a="+a+" b+10="+b)
}

a=10 b+10=20

上述代码又引出了函数和输出的概念。Kotlin的函数采用关键字fun来定义,而输出则是println函数。

fun lagerNumber(Num1:Int,Num2:Int):Int{
    if (Num1>=Num2){
        return Num1
    }
    else{
        return Num2
    }
}

上面就是一个函数的标准写法例子,参数按参数名:参数类型传递,如果函数有返回值则采用函数名:类型名来指定。

二、条件语句

  Kotlin有两种类型的条件语句:if和when。

1、if

  Kotlin的if语句和其他语言的基本一致,但它可以存在返回值--最后执行的语句的值。例如上面的函数可以写成

fun lagerNumber(Num1:Int,Num2:Int):Int{
    return if (Num1>=Num2)Num1 else Num2
}

且这个函数还可以简化为

fun lagerNumber(Num1:Int,Num2:Int)=if (Num1>=Num2)Num1 else Num2

这是因为Kotlin里函数可以采用=来直接赋值,而且由于后面返回的值一定是Int,所以Kotlin可以智能判断函数返回值的类型,所以不需要指明返回值类型。

2、when

  when其实有点像C语言里的switch语句,但它远比switch语句强大。

fun getScore(name:String):Int{
    when(name){
        "John"->97
        "Peter"->99
        "Mark"->88
        "Jack"->89
        "Ketty"->94
        else->85
    }
}
fun main(){
    getScore("Ketty")
}

94

when与switch不同,它不需要加break,完成一个条件后会自动跳出。且when还可以判断是否属于一个类

fun Judge(number:Number){
    when(number){
        is Int->println("Int")
        is Long->println("Long")
        else->println("unknown")
    }
}
fun main(){
    val a=12L
    Judge(a)
}

Long

Number是一个大类,Int、Long、Double都是它的子类。

三、类

  作为面向对象编程的关键,Kotlin怎么能少得了类呢。

1、类的申明

  Kotlin采用关键字class来申明类

open class Person(val name:String,val age:Int){
    fun eat(){
        println("$name is eating")
    }
}

这就定义了一个名为Person[2]的类。
open:代表该类可以被继承,否则默认是不可继承的。
括号里的参数是主构造函数,代表构造两个变量分别名为name和age,且以传进来的值进行初始化。
类里面是定义的函数,所有继承了该类的子类都会有该类的所有特征。

fun main(){
    val p=Person("Jack",12)
    println("${p.name} is ${p.age} years old")
    p.eat()
}

Jack is 12 years old
Jack is eating

这里的${}是Kotlin字符串里内嵌输出表达式的方法,如果是单个变量还可以省略{}

2、类的继承

  继承就是指新建一个类但这个类并不是从头开始建,而是通过继承某些类的特征,再添加自己的特征。比如现在要新建一个名为Student的类,该类肯定符合Person的特征,所以可以继承Person的特征。

class Student(val sno:String,val grade:Int,name:String,age:Int):Person(name,age){
    init{
        println("sno is $sno")
        println("grade is $grade")
    }
}

这里定义了一个从Person继承的子类Student。
继承关系通过Person前的冒号':'表示
类里面的init表示主构造函数,也即创建该类时一定要执行的语句。
Student中的name,age变量不需要为其申明val或者var,因为它们是由父类所决定的

fun main(){
    val s=Student("SA1234",1,"Jack",12)
    s.eat()
}

sno is SA1234
grade is 1
Jack is eating

3、函数形参的默认值

  函数所传递的参数都是可以设置默认值的,只需要直接再定义的时候就赋值即可。

fun person(val name:String="Jack",val age:Int){
        println("$name is eating")
}

如上,Person函数的name变量的默认值就设为了Jack,故你可以不传递这个参数而执行person函数,它的name值就为Jack。

四、接口

  Kotlin是单继承语言,也就是一个类最多只能继承一个父类,但可以实现任意多个接口。
  接口采用关键字interface定义

interface Study{
    fun readBooks()
    fun doHomework()
}

接口就是一群抽象函数的集合,如果一个类继承了接口,就要实现该接口里定义的抽象函数。

class Student(name:String,age:Int):Person(name,age),Study{
    override fun readBooks(){
        println("$name is reading")
    }
    override fun doHomework(){
        println("$name is doing homework")
    }
}

这里的Student就继承了Person和Study。
关键字override用于重写接口里的函数,也可以来重写父类里的函数,同时接口里的函数允许默认实现

fun main(){
    val s=Student(age=12,name="Jack")
    s.readBooks()
}

Jack is reading

这里有一种新的参数传递方式,采用一一对应的方式,即可按照原函数或类的固有顺序。

五、集合

  集合大致可分为三类:List,Set和Map。
  三种集合的创建方法都非常相似,以List为例


fun main(){
    val list=listOf("Apple","Banana","Pear")
    for (i in list){
        println(i)
    }
}

Apple
Banana
Pear

lisOf是kotlin的一个内置函数,用于初始化list。set和map对应的则是setOf和mapOf。但需要注意的是这样创建的集合是无法修改的,因为kotlin默认创建的变量会无法修改(必须要修改的除外)。若想创建可以修改的集合要对应换成mutableListOf()等
  对map要特殊一点,其它两种要添加新量只需使用*fruit.add()*式的函数。而map,则只需直接添加,如

fun main(){
    var map=mutableListOf("Apple" to 1,"Banana" to 2,"Pear" to 3)
    map["Peach"]=4
    for((fruit,number) in map){
        println("$fruit is $number")
    }
}

Apple is 1
Banana is 2
Pear is 3
Peach is 4

Ps:Set与List的具体区别见Set与List

六、Lambda编程

  Lambda的基本语法结构为:

{参数1:参数类型,参数名2:参数类型2->函数体}
最外一层是一个大括号,首先要申明函数列表,然后只需函数体,再将函数体的结果当作最后的值,可以当作参数传递给函数。
val maxLengthFruit=list.maxBy({fruit:String->fruit.length})

这就是一个Lambda编程的例子。list是一个列表,而maxBy方法是将list里得元素一个个取出来,带入Lambda表达式中,再比较大小,取出最大者。
  在最后附上官方文档网页程序运行端


  1. 大学生创新创业计划 ↩︎

  2. 类名最好首字母大写 ↩︎