[kotlin] 面向对象特性2

结合上一篇的博客,kotlin class中的构造方法分为primary constructor 只有一个, secondary constructor可以有多个,主构造方法可以给定参数,那么这些参数的初始化会在class 的init代码块中执行,而secondary constructor 的初始化跟参数是在一起的, 且secondary必须直接或者间接调用primary constructor,这部分内容跟java有着很大的不同。constructor 如果没有修饰符,默认是public的修饰符,而java中是default修饰符,这点也有区别
来,上代码

class Person constructor(userName: String) {

    private var userName: String? = null

    private var age:Int

    private var adderss:String

    init {
        println(userName)

        this.userName = userName
        this.age = 20
        this.adderss = "beijing"
    }

    //直接或者间接调用primary方法
    constructor(userName: String, age: Int) : this(userName){
        println("$userName, $age")

        this.age = age
        this.adderss = "beijing"
    }

    //直接或者间接调用primary方法
    constructor(userName: String, age: Int, address: String) : this(userName, age){
        println("$userName, $age, $address")

        this.adderss = adderss
    }

    fun printInfo() {
        println("username: ${this.userName}, age: ${this.age}, ${this.adderss}")
    }
}

fun main(args: Array<String>) {
    var person = Person("zhangsan")
    var person2 = Person("lisi", 12)
    var person3 = Person("lisi", 20, "nanjing")

    person.printInfo()
    person2.printInfo()
    person3.printInfo()
}

由执行结果可以看出调用顺序,先走primary,再走secondary

kotlin还提供了一种简约的类的定义方式
我们可以直接在构造方法入参中,直接定义成员变量,可以给定成员变量的默认值,这种方式一般在真是的成产开发中比较常见,因为谁都不愿意多写代码��,虽然java有lombok这样的框架减少了很多代码

class Student(private val userName: String, private val age: Int, private var address: String) {

    fun printInfo() {
        println("username: $userName, age: $age, address: $address")
    }
}

/**
 * constructor 有修饰符,或者注解的情况下,constructor关键字不可以省略
 *
 */
class Student2 private constructor(userName: String){

}

/**
 * 构造方法提供默认参数, 如果primary构造方法都有默认值,
 * 在jvm上面如果所有的构造方法都有默认值,编译器会帮我们生成一个不带参数的构造方法,为了去兼容
   第三方比如spring框架
 */
class Student3 (val userName: String = "zhangsan"){}


fun main(args: Array<String>) {
    val student = Student("zhangsan", 20, "beijing")
    student.printInfo()
}

通过代码可以看出来,方法直接可以引用到构造方法定义的值,这个可以通过模板字符串的引用可以看清楚
还有就是一点值得提 在jvm上面如果所有的构造方法都有默认值,编译器会帮我们生成一个不带参数的构造方法,目的是为了去兼容第三方比如spring框架,初始化实例的时候会调用那个不带参数的构造方法,而这个构造方法的初始值会调用所有参数的默认值�� kotlin规矩确实有点多啊,期待后面新的不同,更有深度的学习输出��也很期待,在生成环境中使用kotlin浪一把

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值