类和对象
一、类的声明
class Invoice {
}
类的定义由以下几部分组成: 类名, 类头部(指定类的类型参数, 主构造器, 等等.), 以及由大括号括起的类主体部分. 类的头部和主体部分都是可选的; 如果类没有主体部分, 那么大括号也可以省略。
class Empty
二、构造函数
一个类可以有一个主构造器和一个或多个次构造器。主构造器是类头部的一部分, 位于类名称(以及可选的类型参数)之后。
1.主构造器
class Person constructor(firstName: String) {
}
如果主构造器没有任何注解(annotation), 也没有任何可见度修饰符,constructor关键字可以省略不写。
class Person (firstName: String) {
}
主构造器中不能包含任何代码,如果想初始化数据的话,可以用init关键字作为前缀。
class Customer(name: String) {
init {
logger.info("Customer initialized with value ${name}")
}
}
主构造器的参数可以在初始化块中使用,也可以在类主体定义的属性初始化代码中使用:
class Customer(name: String) {
val customerKey = name.toUpperCase()
}
实际上,在主构造器上声明和初始化属性有更加简洁的写法:
class Person(val firstName: String, val lastName: String) {
// ...
}
与通常的属性一样, 主构造器中定义的属性可以是可变的(var), 也可以是只读的(val)。
如果构造器有注解, 或者有可见度修饰符, 这时 constructor 关键字是必须的, 注解和修饰符要放在它之前:
class Customer public @Inject constructor(name: String) { ... }
2.次构造器
类也可以有二级构造函数,需要加前缀 constructor:
class Person {
constructor(parent: Person) {
}
}
如果类有主构造函数,每个次构造函数都要,或直接或间接通过另一个次构造函数代理主构造函数。在同一个类中代理另一个构造函数使用 this 关键字:
class Person(val firstName: String, val lastName: String) {
constructor(firstName,lastName,age):this(firstName,lastName){
}
}
三、get和set方法
class Person {
var lastName: String = "zhang"
get() = field.toUpperCase() // 将变量赋值后转换为大写
set
var no: Int = 100
get() = field // 后端变量
set(value) {
if (value < 10) {
field = value
} else {
field = -1
}
}
var heiht: Float = 145.4f
private set
}
Kotlin 中类不能有字段。提供了 Backing Fields(后端变量) 机制,备用字段使用field关键字声明,field 关键词只能用于属性的访问器
// 测试
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}")
}