Kotlin基础<一>

[TOC]
  还记得当初在大学学习编程语言的第一次编程体验吗?你第一行写的代码是什么呢?对于C程序员来说,恐怕印象最深刻的就是printf("Hello world")了吧?学习Kotlin,我们也从这个经典的例子开始。

fun main(args: Array<String>) {
    println("Hello world")
}

你发现了kotlin的语法特性了吗?

  • 关键字fun用来定义一个函数。
  • 参数的类型写在参数的后面,如这里的args: Array<String>表示args是一个String的数组。
  • 可以像c++那样在类外面定义函数,而不必像java那样全都写在类里面。
  • 同样是基于JVM的语言,Kotlin使用println("Hello world")而不是更长代码的System.out.println("Hello world")。Kotlin的标准库包装了非常多的Java标准库API。
  • 代码的结尾可以不写分号,就像Python语言那样

函数

现在就来看看一个函数的定义方式:

fun main(args: Array<String>) {
    //println("Hello world")
    val x = 10
    val y = 20
    println("The max number of $x and $y is ${max(x, y)}")
}

fun max(x: Int, y: Int) : Int {
    return if (x > y) x else y
}

//result:
//The max number of 10 and 20 is 20

  函数用fun声明,fun后面是函数名字,这里是max然后是参数列表,再接着是返回值,这里是Int,注意,Int前的不能省略。这样就组成了一个函数声明。
  函数体只有一行语句:return if (x > y) x else y,对于这行代码,你能发现什么?没错,在kotlin中,if是一个有值的表达式(expressions)而不是一个statements。这行代码的意思和Java的三目运算一样:(x > y) ? x : y
  理解了这个,你的函数还可以进一步简化为fun max(x: Int, y: Int): Int = if (x > y) x else y对于简单的函数,你可以直接在返回值后面加一个等号,紧接着是执行的语句。采用这种写法,你甚至可以省略返回值:fun max(x: Int, y: Int) = if (x > y) x else y在kotlin中,这也是可以的。

变量

  在Java中,变量声明一般是int a这种形式,但在kotlin中,这是不行的。在Kotlin中,声明一个变量的形式如下:

    val string = "hello world"
    val age = 20

对于赋初值的变量,你可以省略变量的类型,编译器会自动帮你推导出来,你也可以指定其类型:

 val age: Int = 20

可修改变量和不可修改变量

  对于变量的声明,有两个关键字:
  
- val-不可修改的。用val声明的变量不能被修改
- var-可修改的。用var声明的变量可以再次被重新赋值。
  在kotlin中的建议是,如果一个变量除非是有必要被修改时,才声明其为var,否则一律声明为val
  声明为val的变量的引用,准确的说应该是它的reference是不能被修改的,但是它所指向的对象是可以被修改的。举个例子:

fun main(args: Array<String>) {
    val languages = arrayListOf("Java")
    languages.add("kotlin")
    languages.map(::println)
}
//result:
//Java
//kotlin

这样做是可以的,但如果:

fun main(args: Array<String>) {
    val languages = arrayListOf("Java")
    languages.add("kotlin")
    languages.map(::println)
    languages = arrayListOf("c++")//error
}

或者

val age = 20
age = 50 //error

都是错误的。

字符串模版

在介绍函数的定义的时候,有这么一句:
println("The max number of $x and $y is ${max(x, y)}")
乍一看大家可能觉得有点奇怪,这就是我接下来要介绍的字符串模版了。
在Java中,你得这样干System.out.println("The max number of " + x + " and " + y + " is " + someClassInstance.max(x, y)),在kotlin中就简单多了,如果是一个变量,那么直接在字符串中相应的位置使用$value就可以了,如果是一个表达式或者函数,则需要用花括号括起来:${expressions}
还是用例子来说明:

fun main(vararg args: String) {
    val x = 10
    val y = 20
    println("the max is ${if (x > y) x else y}")
}

//result:
//the max is 20

你还可以在花括号中将用两个双引号的内容还原成字符串:

fun main(vararg args: String) {
    val x = 10
    val y = 20
    println("the max is ${if (x > y) "x" else "y"}")
}

//result:
//the max is y