Kotlin 主构造函数 次构造函数 默认参数 init代码块 初始化顺序

Posted 安果移不动

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Kotlin 主构造函数 次构造函数 默认参数 init代码块 初始化顺序相关的知识,希望对你有一定的参考价值。

package set

import java.util.*
import kotlin.math.absoluteValue

//临时变量 只是用一次推荐使用下划线开头
class Player(
    _name: String, _age: Int, _isNormal: Boolean //构造参数
) 

    //属性

    var name = _name
        get() = field.replaceFirstChar  if (it.isLowerCase()) it.titlecase(Locale.getDefault()) else it.toString() 
        set(value) 
            field = value.trim()
        
    //取绝对值
    var age = _age
        get() = field.absoluteValue
        set(value) 
            field = age.absoluteValue
        
    var isNormal = _isNormal;



fun main() 
    val p = Player("Jack", 20, true)
    p.name = "rose"
    println(p.name)
    println(p.age)
    println(p.isNormal)

可以把属性方到上面去 简化写法

package set

import java.util.*
import kotlin.math.absoluteValue

//临时变量 只是用一次推荐使用下划线开头
class Player(
    _name: String,
    var age: Int, 
    var isNormal: Boolean //构造参数
) 

    //属性
    var name = _name
        get() = field.replaceFirstChar  if (it.isLowerCase()) it.titlecase(Locale.getDefault()) else it.toString() 
        set(value) 
            field = value.trim()
        
   



fun main() 
    val p = Player("Jack", 20, true)
    p.name = "rose"
    println(p.name)
    println(p.age)
    println(p.isNormal)

对于java而言就是减少 this.age=age这样的操作

众所周知。java的构造方法不止可以写一个。对与kotlin如何实现呢

那就要讲到次构造函数了。

package set

import java.util.*
import kotlin.math.absoluteValue

//临时变量 只是用一次推荐使用下划线开头
class Player(
    _name: String, var age: Int, var isNormal: Boolean //构造参数
) 

    //属性
    var name = _name
        get() = field.replaceFirstChar  if (it.isLowerCase()) it.titlecase(Locale.getDefault()) else it.toString() 
        set(value) 
            field = value.trim()
        

    //次构造函数
    constructor(name: String) : this(name, age = 20, isNormal = false) 
        //里面可以对代码进行操作
        this.name = name.uppercase(Locale.getDefault());
    



fun main() 
    val p = Player("Jack", 20, true)
    p.name = "rose"
    println(p.name)
    println(p.age)
    println(p.isNormal)
    val p2 = Player("Jack Liu")
    println(p2.name)


次构造函数要调用主构造函数初始化提供默认值即可 

默认参数

其实次构造函数的使用场景 如果不在次构造函数里面进行运算。可以写到构造方法当中

package set

import java.util.*
import kotlin.math.absoluteValue

//临时变量 只是用一次推荐使用下划线开头
class Player(
    _name: String, var age: Int=20, var isNormal: Boolean=false //构造参数
) 

    //属性
    var name = _name
        get() = field.replaceFirstChar  if (it.isLowerCase()) it.titlecase(Locale.getDefault()) else it.toString() 
        set(value) 
            field = value.trim()
        



fun main() 
    val p = Player("Jack", 20, true)
    p.name = "rose"
    println(p.name)
    println(p.age)
    println(p.isNormal)
    val p2 = Player("Jack Liu")
    println(p2.name)

下面学习init代码块

之前java里面有一个 static代码块

他是再类加载到虚拟机的时候初始化

init的初始化块什么时候执行呢

他是再构造函数的时候执行。

我们可以用来对传递进来的数值进行检查

package set

import java.util.*
import kotlin.math.absoluteValue

//临时变量 只是用一次推荐使用下划线开头
class Player(
    _name: String, var age: Int = 20, var isNormal: Boolean = false //构造参数
) 

    //属性
    var name = _name
        get() = field.replaceFirstChar  if (it.isLowerCase()) it.titlecase(Locale.getDefault()) else it.toString() 
        set(value) 
            field = value.trim()
        

    init 
        //检查是否
        require(age > 0)  "age 必须大于0" 
        require(name.isNotBlank())  "姓名必须设置" 
    


fun main() 
    val p = Player("Jack", 20, true)
    p.name = "rose"
    println(p.name)
    println(p.age)
    println(p.isNormal)
    val p2 = Player("Jack Liu")
    println(p2.name)
    val p3 = Player("Jack Liu", age = 0)

 这些代码初始化的地方挺多的 顺序是怎么样的呢

主构造函数里声名的属性。

类级别的属性赋值。

init初始化块里的属性赋值和函数调用

次构造函数里的属性赋值和函数调用

 

以上是关于Kotlin 主构造函数 次构造函数 默认参数 init代码块 初始化顺序的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin 主构造函数 次构造函数 默认参数 init代码块 初始化顺序

Kotlin类与继承

kotlin之构造函数(constructor)

Kotlin 类与继承

Kotlin 中定义类field关键字,主构造函数和次构造函数详解

Kotlin 中定义类field关键字,主构造函数和次构造函数详解