Kotlin的Constructor总结

前言

最近开始学Kotlin,买了本《Kotlin极简教程》,以后绝对不要在京东阅读上买计算机的电子书,坑爹,我又去买了本实体版。最近看到面向对象这章,本文探讨了下构造函数的一些问题

问题

构造函数简单而言就是在创建类的实例时调用的函数。Kotlin中如果没有可见修饰符或者注解(annotation),就可以忽略不写constructor,反之则要写。修饰符和注解都要写在constructor前面。

Kotlin支持类有一个主构造函数和一到多个次构造函数。使用次构造函数可以根据参数的不同创建不同的实例。比如下面的例子:

1
2
3
4
5
6
7
8
9
10
11
class Person constructor(val sex: String, val age: Int, val name: String){
var weight:Double = 0.0
init {
println("The sex is $sex")
println("The age is $age")
}
constructor(sex: String, age: Int, name: String, weight: Double):this(sex,age,name){
this.weight = weight
}
}

我们可以这样调用:

1
2
3
4
5
6
fun main(args: Array<String>){
val p1 = Person("male",23,"jack") //调用的主构造函数
println("All property of p1 is: sex->${p1.sex},age->${p1.age},name->${p1.name}")
val p2 = Person("female",16,"Michelle",45.7) //调用次构造函数
println("The weight of P2 is ${p2.weight}")
}

返回的结果是:

1
2
3
4
5
6
The sex is male
The age is 23
All property of p1 is: sex->male,age->23,name->jack
The sex is female
The age is 16
The weight of P2 is 45.7

次构造函数的函数签名不能有val或者var,而且必须通过this委托给主构造函数。

注意!

1.只能在主构造函数里用init{}

2.这样的代码是错的:

1
2
3
4
5
6
7
8
9
10
class Person constructor(val sex: String, val age: Int, val name: String){
init {
println("The sex is $sex")
println("The age is $age")
}
constructor(sex: String, age: Int, name: String, weight: Double):this(sex,age,name){
val weight: Double = weight
}
}

如果想正确地访问weight变量,只能在主构造函数里创建变量并赋值(不然IDE会提示要不非抽象属性或者要初始化),然后通过this在次构造函数里赋合适的值。无法在次构造函数里创建val或者var

Powered by Hexo and Hexo-theme-hiker

Copyright © 2017 - 2020 HOCHIKONG's WAPORIZer All Rights Reserved.

访客数 : | 访问量 :