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委托的函数如果一个非抽象类没有声明任何(主或次)构造函数,它会有一个生成的不带参数的主构造函数。构造函数的可见性是 public。如果你不希望你的类有一个公有构造函数,你需要声明一个带有非默认可见性的空的主构造函数:
class NetworkConfig private constructor() { }kotlin 没有 new关键字
val networkConfig = NetworkConfig(1.0, 5,"bch") val networkConfig1 = NetworkConfig()