Kotlin学习总结:Kotlin基础(一)
在这一部分学习了Kotlin的基本要素:变量、函数和类,顺便熟悉Kotlin的属性概念。
基本要素:函数和变量
- 关键字fun用来声明一个函数。
- 参数的类型写在它的名称后面。
- 函数可以定义在文件的最外层,不需要把它放在类中。
- 数组就是类。和Java不同,Kotlin没有声明数组类型的特殊语法。
- 使用println代替了System.out.println。Kotlin标准库给Java标准库函数提供了许多语言更简洁的包装,而println就是其中一个。
- 和许多其他现代语言一样,可以省略每行代码结尾的分号。
函数
函数的声明以关键字fun开始,函数名称紧随其后:例子中函数名称是max。接下来是括号起来的参数列表。参数列表的后面跟着返回类型,它们之间用一个冒号(:)隔开。
在Kotlin中if是有结果值的表达式。它和Java中的三元运算符相似:(a>b)?a:b
fun max(a: Int, b: Int): Int {
return if (a > b) a else b
}
语句和表达式
在Kotlin中,if是表达式,而不是语句。语句和表达式的区别在于,表达式有值,并且能作为另一个表达式的一部分使用;而语句总是包围着它的代码块中的顶层元素,并且没有自己的值。在Java中,所有的控制结构都是语句。而在Kotlin中,除了循环(for、while和do/while)以外大多数控制结构都是表达式。
另一方面,Java中的赋值操作是表达式,在Kotlin中反而变成了语句。
表达式函数体
让前面的函数体变得更简单。因为它的函数体是由单个表达式构成,可以用这个表达式作为完整的函数体,去掉花括号和return语句:
fun max(a: Int, b: Int): Int = if(a > b) a else b
如果函数体写在花括号({})中,我们说这个函数有代码块体。如果它直接返回了一个表达式,它就有表达式体。
Intellij IEDA提供了在两种函数风格之间转换的intention actions(意向动作):“Convert to expression body”(转换成表达式函数体)和"Convert to block body"(转换成代码块函数体)。
对表达式体函数来说,编译器会分析作为函数体的表达式,并把它的类型作为函数的返回类型,即使没有显式地写出来。这种分析通常被称作类型推导。
进一步简化max函数,省掉返回类型:
fun max(a: Int, b: Int) = if(a > b) a else b
注意,只有表达式体函数地返回类型可以省略。对于有返回值的代码块体函数,必须显式地写出返回类型和return语句。
变量
Kotlin中以关键字开始,然后是变量名称,最后加上类型(不加也可以)。
val question = "The Ultimate Question of Life, the Universe, and Everything"
val answer = 42
val answer: Int = 42
和表达式函数一样,如果不指定变量地类型,编译器会分析初始化器表达式的值,并把它的类型作为变量的类型。
如果变量没有初始化器,需要显示地指定它的类型:
val answer: Int
answer = 42
可变变量和不可变量
- val(来自value)——不可变引用。使用val声明的变量不能在初始化之后再次赋值。它对应的是Java的final变量。
- var(来自variable)——可变引用。这种变量的值可以被改变。这种声明对应的是普通(非final)的Java变量。
默认情况下,应该极可能地使用val关键字来声明所有地Kotlin变量,仅在必要地时候换成var。
在定义了val变量地代码块执行期间,val变量只能进行唯一一次初始化。但是如果编译器确保只有唯一一条初始化语句会被执行,可以根据条件使用不同的值来初始化它:
val message: String
if (canPerformOperation)){
mesaage = "Success"
} else {
message = "Failed"
}
注意,尽管val引用自身是不可变地,但是它指向地对象可能是可变地。例如:
val languages = arrayListOf("Java") // 声明不可变引用
languages.add("Kotlin") // 改变引用指向地对象
即使var关键字允许变量改变自己的值,但它的类型却是改变不了的。例如:
var answer = 42
answer = "no answer" // 错误:类型不匹配
如果需要在变量中存储不匹配类型的值,必须手动改把值转换或强制转换到正确的类型
更简单的字符串格式化:字符串模板
fun main(args: Array<String>){
val name = if (args.size > 0) args[0] else "Kotlin"
println("Hello, $name!") // 打印的是"Hello, Kotlin",如果你把"Bob"作为实参传进来,打印的就是"Hello, Bob"
}
和许多脚本语言一样,Kotlin让你可以在字符串字面值中引用布局变量,只需要在变量名称前面加上字符$。这等价于Java中的字符串连接(“Hello, " + name + “!”),效率一样但是更紧凑(编译后的代码创建了一个StringBuilder对象,并把常量部分和变量附加上去)。当然表达式会进行静态检查,如果试着引用一个不存在的变量,代码根本不会编译。
如果要在字符串中使用$字符,要对它转义:println(”\$")
还可以引用更复杂的表达式,而不是仅限于简单的变量名称,只需要把表达式用花括号括起来:
fun main(args: Array<String>) {
if (args.size > 0) {
println("Hello, ${args[0]!"}) // 使用${}的语法插入args数组中的第一个元素
}
}
还可以在双引号中直接嵌套双引号,只要它们处在某个表达式的范围内(即花括号内):
fun main(args: Array<String>) {
println("Hello, ${if (args.size > 0) args[0] else "someone"}!)
}