Kotlin学习(二)数组

  • 数组
  • 类的定义
  • 类的属性
  • 属性定义
  • getter 和 setter
  • 实例

数组

数组用类Array实现,并且还有一个 size 属性及 get 和 set 方法,由于使用 [] 重载了 get 和 set 方法,所以我们可以通过下标很方便的获取、设置数组对应位置的值
数组的两种创建方式:
1.使用函数arrayOf()
2.使用工厂函数
如下:分别使用了两种方式创建了两个数组

fun main(args: Array<String>){
	//[1,2,3]
	val a = arrayOf(1, 2, 3)
	//[0,2,4]
	val b = Array(3, { i -> (i * 2) })
 
   //读取数组内容
    println(a[0])    // 输出结果:1
    println(b[1])    // 输出结果:2
}

如上所述,[] 运算符代表调用成员函数 get() 和 set()。
注意:与Java不同的是,Kotlin 中数组是不型变的(invariant)
除了类Array,还有ByteArray,ShortArray,IntArray等,用来表示各个类型的数组,省去了装箱操作,因此效率更高,其用法同Array一样:

val x: IntArray = intArray(1, 2, 3)
x[0] = x[1] + x[2]

类的定义

Kotlin类可以包含:构造函数、初始化代码块、函数、属性、内部类、对象声明
Kotlin中使用关键字 class声明类,后面紧跟类名:

class Runoob{//类名为Runoob
	//大括号内是类体构成
}

我们也可以定义一个空类:

class Empty

可以在类中定义成员函数:

class Runoob(){
	fun foo() {print("Foo")}//成员函数
}

类的属性

属性定义

类的属性可以用关键字 var 声明为可变的,否则使用只读关键字 val 声明为不可变

class Runoob{
	var name: String = ....
	var url: String = ....
	var city: String = ....
}

我们可以像使用普通函数那样使用构造函数创建类实例:

val site = Runoob() //注意:Kotlin 中没有 new 关键字

要使用一个属性,只要用名称引用它即可

site.name //使用 . 号来引用
site.url

kotlin 中的类可以有一个主构造器,以及一个多个次构造器主构造器类头部一部分,位于类名称之后

class Person constructor(firstName: String) {}

如果主构造器没有任何注解,也没有任何可见度修饰符,那么constructor关键字可以省略。

class Person(firstName: String){
}
getter 和 setter

属性声明的完整语法:

var <propertyName>[: <PropertyType>] [= <property_initializer>]
	[ <getter> ]
	[ <setter> ]

getter 和 setter 都是可选
如果属性类型可以从初始化语句或者类的成员函数中推断出来,就可以省去类型,val 不允许设置setter函数,因为它是只读的。

var allByDefault: Int?//错误:需要一个初始化语句,默认实现了 getter 和 setter 方法
var initialized = 1      //类型为 Int,默认实现了 getter 和 setter
val simple: Int?         //类型为 Int,默认实现了 getter,但必须在构造函数中初始化
val inferredType = 1 //类型为 Int 类型,默认实现 getter
实例

以下实例定义了一个 Person 类,包含两个可变变量 lastName 和 no,lastName 修改了getter方法,no 修改了 setter 方法

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 height: Float = 145.4f
        private set//设置其set为private的
}

// 测试
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}")

}

输出结果为:

lastName:WANG
no:9
no:-1

Kotlin中类不能有字段。提供了Backing Fields(后端变量)机制,备用字段使用field关键字声明,field关键词只能用于属性的访问器,如以下实例:

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

非空属性必须在定义的时候初始化,kotlin提供了一种可以延迟初始化的方案,使用 lateinit 关键字描述属性:

public class MyTest {
    lateinit var subject: TestSubject

    @SetUp fun setup() {
        subject = TestSubject()
    }

    @Test fun test() {
        subject.method()  // dereference directly
    }
}