您的位置:首页 > 其它

Kotlin学习系列(三)

2016-04-06 15:48 239 查看

类声明

Kotlin使用
class
关键字声明类:

class Invoice{

}

Kotlin类声明基本包括header与body:

[<Modifier>] <class> [<Visibility modifiers>]  <className> [<constructor>]
[< body>]

构造器

kotlin的类能有一个主要的构造器与多个次要的构造器。主构造器出现在类名的后面参数是可选的。

class Person constructor(firstName: String){
...
}

如果主构造器没有注解或可见修饰符
constructor
关键字可以省略:

class Person(firstName: String){
...
}

Kotlin能够使用
constructor
声明多个次要的构造器:

class Person{
constructor(parent: Person){

}

constructor(name: String, parent: Person){

}
}

如果类有一个主构造器其他的构造器都需要去直接或间接的调用它:

class Person(val name: String){
constructor(name: String, parent: Person): this(name){

}
}

创建实例

Kotlin没有
new
关键字,创建类的实例只需要调用对应的构造方法:

val invoice = Invoice()
val person = Person("xx")

继承

所有的class有一个共同的超类
Any
如果类声明时没有指定超类默认继承
Any
:

class Empty  //默认继承Any

继承一个指定的类通过在class header后面添加冒号与父类:

open class Base(p: Int)

class Derived(p: Int): Base(p)  //指定构造器

如果子类有主构造器可以在class header中初始化超类,如果该类没有主构造器由其他的构造器通过
super
关键字直接或间接始化超类:

open class Base(p: Int)

class Derived: Base{

constructor(p: Int): super(p){

}
}

open
注解与java中的
final
相反表示类是否可以被继承,Kotlin中所有的类默认是
final


重写成员方法

Kotlin使用
open
标记成员是否可被重写,
override
显示说明该成员重写父类方法:

open class Base {
open fun v() {}
fun nv() {}
}
class Derived() : Base() {
override fun v() {}
}

属性

声明属性语法:

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

除了初始化和getter/setter是可选的以外属性类型如果能够推断出的话也可以省略。只读属性的声明

语法与可读属性声明只有两个差别:使用val替换var、没有setter。

Kotlin中的类声明可变的(var)属性与只读(val)属性:

class Person{
public var name: String = ""
public val IdCard: String =  "xxx"

}

通过属性名称使用类中的属性,类似Java中的Field:

fun out(p: Person){

println("name: ${p.name}")
println("id: ${p.id}")
}

getter/setter:

public var name: String
get() = "undefined"
set(value) {

}

如果只需要重新定义getter/setter的可见性或注解它们但不需要去更改它们行为可以只定义getter/setter不需要定义主体:

public var name: String = ""
get() = "undefined"
private @Inject set

Kotlin中不能有field,但是在自定义getter/setter的时候可能需要去直接访问属性而不是通过getter/settter。Kotlin自动提供

一个备用字段(field),通过它使用使用属性标识符来访问它。

public var fieldProp = ""
get() = field
set(value) {
field = value;
}

编译时常量

如果属性能在编译时就已经确定它的值可以使用
const
关键字声明一个编译时常量但它需要满足以下要求:

只要出现在最顶层或对象内部

只支持
String
与原始类型

无法算自定义getter

const val COMPILE_CONSTANT = ""
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: