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
}
}