1. Kotlin语言里的小魔术
1.1字符串内嵌表达式
首先来看一下Kotlin语言中的字符串内嵌表达式的语法结构:
"hello , ${obj.name} . nice to meet you!"
可以看到,Kotlin允许我们在字符串里面嵌入${}这种语法结构的表达式,
并且运行的时候可以使用这个表达式的执行结果来代替这一部分的内容
当表达式只有一个参数的时候{}可以省略.
hello , $obj.name . nice to meet you!
这里我们举一个例子来说明一下:
这是不用内嵌表达式的时候
fun main() {
var name = "Tom"
var age = 18
println("name is " + name + ", and age is " + age)
}
这是用了内嵌表达式的时候
fun main() {
var name = "Tom"
var age = 18
println("name is $name, and age is $age")
}
运行结果:
相信你也体会到内嵌表达式的快捷之处了吧.
1.2 函数参数的默认值
我们最开始在学习次构造函数的时候就说过,次构造函数在Kotlin中很少,
因为Kotlin提供了函数设定默认值的功能,
它在很大程度上能够代替次构造函数.
给函数参数设定默认值:
fun printParams(num: Int=100, str: String = "hello") {
println("num is $num and str is $str")
}
下面我们来运行一下这个代码:
fun main() {
printParams()
}
fun printParams(num: Int=100, str: String = "hello") {
println("num is $num and str is $str")
}
运行结果:
fun main() {
// 先使用函数参数的默认值
printParams()
println("---------------------")
// 这里我们手动给函数参数赋值
printParams(99, "World")
}
fun printParams(num: Int = 100, str: String = "hello") {
println("num is $num and str is $str")
}
运行结果:
如果这时我们想让num参数使用默认值该怎么办?(如果模仿刚才的写法,
编译器会认为我们想把字符串赋值给第一个参数, 从而报参数类型不匹配的错误.)
这时我们就需要用Kotlin提供的另一种机制,按照键值对的方式来传参,
从而不需要向传统写法那样按照参数定义的顺序来传参,这时我们可以这样写:
我们来看一下我们以前在学习次构造函数时写的代码:
open class Person(name: String, age: Int)
class Student(val sno: String, val grade: Int, name: String, age: Int) : Person(name, age) {
// 第一个次构造函数
constructor(name: String, age: Int) : this("", 0, name, age) {}
//第二个次构造函数
constructor() : this("", 0) {}
}
上述代码中有一个主构造函数和两个次构造函数,
次构造函数的作用是提供了使用更少参数来对Student类进行实例化的方式.
无参的次构造函数会调用两个参数的次构造函数,并将这2个参数赋值成为初始值.
其实这种写法在Kotlin中是完全没有必要的,
因为我们完全可以通过只编写一个主构造函数,
然后给参数设定默认值的方式来实现:
class Student(val sno: String = "", val grade: Int = 0, name: String = "", age: Int = 0) :
Person(name, age) {
}
在给主构造函数的每个参数都设置默认值后,
我们就可以使用任何的传参组合来对Student类进行实例化,
当然也包含了刚刚两个次构造函数的情形.