类
kotlin中类是由class
声明,kotlin的类声明有三部分, 类名,类头(指定类型参数,主构造函数),类体(花括号),类头和类体都是可选
//全类声明
class NetworkConfig(name: String) {
}
//只有类名
class NetworkConfig
//有类名和类体,没有主构造参数
class NetworkConfig{
}
构造参数
kotlin可以拥有一个主构造函数和多个次构造函数,主构造函数是类头的一部分:它跟在类名(与可选的类型参数)后.
//全类声明
class NetworkConfig constructor(name: String) {
}
其中constructor
是可选的,如果主构造函数没有任何注解和可见性修饰符,可以省略constructor
//全类声明
class NetworkConfig (name: String) {
}
在主构造函数中,如果没有声明构造参数的类型,就是默认的val
,不可修改,如果想要可以修改可以这样写
//全类声明
class NetworkConfig (var name: String) {
}
次构造参数
在类里也可以声明由constructor
的次构造函数:
class NetworkConfig {
var agent: Int
constructor(ag: Int) {
agent = ag
}
}
如果有主构造函数,那么所有的次构造函数需要直接或者间接委托给主构造函数,
委托到同一个类的另一个构造函数用 this
关键字即可:
class NetworkConfig constructor(var name: String) {
var agent: Int = 0
var old: Int = 0
constructor(ag: Int, name: String) : this(name) {
agent = ag
}
constructor(old: Int, ag: Int, name: String) : this(ag, name) {
this.old = old
}
}
this
这个字段的作用在这里和java中super有一定相似,但是其实完全不同,
类的属性初始化器
init
是kotlin的属性初始化关键字
class NetworkConfig constructor(var name: String) {
var agent: Int = 0
constructor(ag: Int, name: String) : this(name) {
Log.e("TAG", "init2")
agent = ag
}
init {
Log.e("TAG", "init1")
agent = 0;
}
}
在init
中的代码的执行级别是仅次于主构造函数的,在次构造函数之前
class NetworkConfig constructor(var name: String) {
var agent: Int = 0
var old: Int = 0
var old1: String = name
var ff: Good? = null
init {
Log.e("TAG", "init1")
agent = 0;
}
init {
Log.e("TAG", "init2")
agent = 0;
}
constructor(ag: Int, name: String) : this(name) {
Log.e("TAG", "init3")
agent = ag
}
constructor(old: Int, ag: Int, name: String) : this(ag, name) {
Log.e("TAG", "init4")
this.old = old
}
}
从这里可以看到
- 第一执行的是主构造参数,
- 其次就是属性赋值,
- 第三就是
init
标识的类的属性初始化器, - 第四就是次构造参数
同时因为对与this
关键字的执行顺序也和java
中的super
一样,先执行this
委托的函数
构造函数的默认值
class NetworkConfig constructor(var name: String = "") {
}
如果一个非抽象类没有声明任何(主或次)构造函数,它会有一个生成的不带参数的主构造函数。构造函数的可见性是 public。如果你不希望你的类有一个公有构造函数,你需要声明一个带有非默认可见性的空的主构造函数:
class NetworkConfig private constructor() {
}
创建类
kotlin 没有 new
关键字
val networkConfig = NetworkConfig(1.0, 5,"bch")
val networkConfig1 = NetworkConfig()