类与对象

用class声明
可以像普通函数一样使用构造函数创建类。

1
val site = Runoob() // Kotlin 中没有 new 关键字

要使用类中的属性直接用.来引用即可。

主构造器,直接作为类头部的一部分,位于类名后。

1
class Person constructor(firstName: String) {}

如果没有特别的注解可以省略contstructor的关键字。
如果构造器有注解,或者有可见度修饰符,这时constructor关键字是必须的,注解和修饰符要放在它之前。

getter和setter

默认会实现getter方法和setter方法,val不会有setter方法。
field指的就是存储在属性中的值。
field 关键词只能用于属性的访问器
示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
class Person {

var lastName: String = "zhang"
get() = field.toUpperCase() // 将变量赋值后转换为大写
set

var no: Int = 100
get() = field // 后端变量
set(value) {
if (value < 10) { // 如果传入的值小于 10 返回该值
field = value
} else {
field = -1 // 如果传入的值大于等于 10 返回 -1
}
}

var heiht: Float = 145.4f
private set
}

// 测试
fun main(args: Array<String>) {
var person: Person = Person()

person.lastName = "wang"

println("lastName:${person.lastName}")

person.no = 9
println("no:${person.no}")

person.no = 20
println("no:${person.no}")

}

其中的get,set方法也都可以设置为public或者private。

class类中,如果属性不是在主构造器中定义的,必须有初始化,或者lateinit属性。

lateinit

允许延迟初始化

init

初始化代码,允许放在初始代码段中。用init关键字作为前缀

1
2
3
4
5
class Person constructor(firstName: String) {
init {
println("FirstName is $firstName")
}
}

次构造函数

次构造函数必须加前缀constructor
如果类有主构造函数,那么每个次构造函数必须直接或间接代理主构造函数,可以理解为继承。
例如:

1
2
3
4
5
class Person(val name: String) {
constructor (name: String, age:Int) : this(name) {
// 初始化...
}
}

注意:在 JVM 虚拟机中,如果主构造函数的所有参数都有默认值,编译器会生成一个附加的无参的构造函数,这个构造函数会直接使用默认值。这使得 Kotlin 可以更简单的使用像 Jackson 或者 JPA 这样使用无参构造函数来创建类实例的库。

1
class Customer(val customerName: String = "")

对象的属性必须用var或者val表明出来,当然它也可以简写在主构造器中,可以简单的表示出来。如果没用var或者val修饰,那么他只是一个普通的参数,而不是一个对象的属性。而且只有主构造器才可以这样直接声明属性,次构造器不允许这样子使用