函数
从一个最经典的例子:Hello World 开始。我们写一个打印输出 Hello World 的函数:
从这个函数我们可以观察到一下几点:
上面的函数没有返回值,如果我们需要定义一个有返回值的函数,应该怎么做?
使用关键字 fun 定义一个函数,输入两个参数,参数后面是我们需要的返回值类型,之间用:隔开。所以,上面两个例子我们基本可以总结出来 Kotlin 函数的基本格式:
表达式函数体
大家有没有注意到上面的 if 表达式。在 Kotlin 中,if 是表达式,不是语句。那么表达式和语句的区别是什么呢?表达式和语句的区别在于:表达式有值,并且能作为另外一个表达式的一部分使用;而语句总是包围着它的代码块中的顶层元素,并且没有自己的值。在 Java 中,所有的控制结构都是语句,而在 Kotlin 中,除了循环(for、while、do/while)以外,大多数控制结构都是表达式。
另一方面,Java 中的赋值操作都是表达式,在 Kotlin 中反而都成了语句。这有助于避免比较和赋值之间的混淆。
那么,什么是表达式函数体?我们可以把上面的函数改写成下面的样子:
可以看到,它的函数体由单个表达式构成,可以用这个表达式作为完整的函数体,并且去掉了花括号和 return 语句。如果这个函数写在花括号中,我们说这个函数有代码块体;如果它直接返回了一个表达式,它就有表达式体。
我们还可以进一步简化上述函数:
可以看到,我们省略了返回值类型。为什么这里可以省略返回值类型?作为一门静态类型语言,Kotlin 不是要求每个表达式都应该在编译期具有类型吗?事实上,每个变量和表达式都有类型,每个函数都有返回类型。但是对于表达式体函数来说,编译器会分析作为函数体的表达式,并把它的类型作为函数的返回类型,这种分析通常被称为类型推导。
变量
Kotlin 变量的定义是以关键字开始,然后是变量名称,然后是类型,然后是变量值:
当然如果变量已经初始化,我们可以省略类型:
和表达式体函数一样,如果不指定变量类型,编译器会分析初始化值,把它的类型作为变量的类型。如果变量没有初始化,需要显式的指明类型
关键字
val:不可变引用。使用 val 声明的变量不能在初始化之后再次赋值
var:可变引用。这种变量的值可以被改变。
尽管 val 引用自身是不可变的,但是它指向的对象可能是可变的,例如:
var 关键字允许变量改变自己的值,但是它的类型是改变不了的。例如下面代码会编译报错:
字符串模板
直接看下面的一种表达方式:
这种表达方式介绍了一个新特性:字符串模板。和许多脚本语言一样,Kotlin 让你可以在字符串字面值中引用局部变量,只需要在变量名称面前加上 $ 符号;如果需要使用 $ 字符,需要进行转义:
我们还可以使用更复杂的表达式,而不仅仅限于变量名称,这个时候需要使用花括号把表达式括起来:
领取专属 10元无门槛券
私享最新 技术干货