1. primary与secondary构造方法
对于一个secondary的构造方法,必然会直接或间接的调用primary构造方法。
- 示例代码
class Person constructor(username: String) {//primary构造方法
private var username: String
private var age: Int
private var address: String
init {
println(username)
this.username = username
this.age = 20
this.address = "beijing"
}
//secondary构造方法
constructor(username: String, age: Int) : this(username) {
println(username + "," + age)
this.username = username
this.age = age
this.address = "beijing"
}
//secondary构造方法
constructor(username: String, age: Int, address: String) : this(username, age) {
this.address = address
}
fun printInfo() {
println("username: ${this.username},age:${this.age},address:${this.address}")
}
}
fun main(args: Array<String>) {
val person = Person("zhangsan")
var person2 = Person("lisi", 30)
var person3 = Person("wangwu", 40, "hangzhou")
person.printInfo()
person2.printInfo()
person3.printInfo()
}
- 运行结果
zhangsan
lisi
lisi,30
wangwu
wangwu,40
username: zhangsan,age:20,address:beijing
username: lisi,age:30,address:beijing
username: wangwu,age:40,address:hangzhou
2.针对上述代码使用另一个方式实现
- 示例代码
package com.leofight.kotlin
class Student(private val username: String, private val age: Int, private var address: String) {
fun printInfo() {
println("username:$username,age:$age,address:$address")
}
}
/**
* 如果构造方法拥有注解或是可见性修饰符,
* 那么constructor关键字就是不能省略掉的,并且它位于修饰符后面
*/
class Student2 constructor(username: String) {
}
/**
* 在JVM上,如果类primary构造方法所有参数都拥有默认值,那么kotlin编译器就会为这个类生成一个不带参数的构造方法,
* 这个不带参数的构造方法会使用这些参数的默认值,这样做的目的在于可以跟Spring等框架更好地集成。
*/
class Student3(val username: String = "zhangsan") {
}
fun main(args: Array<String>) {
val student = Student("zhangsan", 20, "shenzhen")
student.printInfo()
var student3 = Student3();
println(student3.username)
}
- 运行结果
username:zhangsan,age:20,address:shenzhen
zhangsan
1)如果构造方法拥有注解或是可见性修饰符,那么constructor关键字就是不能省略掉的,并且它位于修饰符后面。
2)在JVM上,如果类primary构造方法所有参数都拥有默认值,那么kotlin编译器就会为这个类生成一个不带参数的构造方法,这个不带参数的构造方法会使用这些参数的默认值,这样做的目的在于可以跟Spring等框架更好地集成。
网友评论