kotlin学习笔记(二)

来源:互联网 发布:vlookup查找相同数据 编辑:程序博客网 时间:2024/05/18 21:10

类和对象

一、类的声明

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(firstNamelastName,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}")}