文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Kotlin类与属性及构造函数的使用详解

2024-04-02 19:55

关注

1.类的属性 filed

1)在kotlin中定义属性,必须赋初始值,要不编译器检查不通过。这个和java不同

2)kotlin会针对于定义的每个属性都封装了一个field,用于存储数据。

3)针对于非private的var(可变)属性,kotlin默认会生成一组getter和setter方法,通过反编生成的byteCode代码可以看到定义的setter和getter方法。

4 )针对于非private的val(不可变)属性,kotlin只生成了getter方法,没有setter方法,因为定义为val的属性,是不允许修改的。

5)我们也可以在属性后面,复写getter和setter方法,自己定义要实现的内容。

6)针对于private关键字修饰的属性,kotlin不对外提供setter和getter方法。尽管我们能够复写这两个方法。外界还是不能够访问。这点和Java有很大的不同。

class Person {
    //针对于定义的每个属性,都有一个filed进行封装。
    //对于非private的属性,都会生成一对getter和setter方法
    //我们也可以自己定义这俩方法
    var name = ""
        get() = field.plus("_01")
        set(value) {
            field = value.uppercase()
        }
    //对于val的属性,kotlin不听过setter方法
    val age = 0
        get() = field + 1
    //对于private属性,kotlin不提供getter和setter方法。
    //虽然我们已经复写了,但是外界还是不够能访问,这个和java的区别很大。
    private var subject = ""
        get() = "Kotlin"
        set(value) {
            field = value
        }
}
fun main() {
    val person = Person()
    person.name = "LiLei"
    println(person.name)
    println(person.age)
}

2.构造函数

1)定义在class 类名 后面的构造函数,是类的主构造函数。这个和java不一样,可以直接定义在类上

2)在主构造函数中,可以使用临时变量给类属性赋值,为了方便识别,在kotlin中,临时变量通常会以下划线开头_属性名。如_name:String

3)在主构造函数中,可以同时定义临时变量和类属性,要加上var或val修饰符。如var age:Int

4)在属性参数后直接设置默认值。创建对象时,默认参数可以不传。如var subject:String="Kotlin"

5通过constructor() : this可以定义次构造函数

6)通过init{}定义初始化块,对所传参数进行有效性检查。初始化块会在构造类实例时执行。

//定义在class 类名 后面的构造函数,是类的主构造函数。
//在主构造函数中,可以使用临时变量给类属性赋值,为了方便识别,在kotlin中,临时变量通常会以下划线开头_属性名。
//也可以在主构造函数中,可以同时定义临时变量和类属性,要加上var或val修饰符。
//还可以在属性后直接设置默认值。创建对象时,默认参数可以不传。
class Person(_name: String, var age: Int, var subject: String = "Kotlin") {
    var name = _name
        get() = field.plus("_01")
        set(value) {
            field = value.lowercase()
        }
    //次构造函数
    constructor(_name: String, _age: Int) : this(_name, _age, "Java"){
        this.name = _name.trim()
    }
    //无参是次构造函数
    constructor() : this("", 1, "")
    //初始化代码块
    init {
        //通过require函数,对属性值做合规判断。如果
        require(age > 0) { "age must be >0" }
        require(name.isNotEmpty()){"name can not be empty"}
    }
}
fun main() {
    val person = Person("LiLei ", 18)
    println(person.name)
    println(person.age)
    println(person.subject)
}

3.执行顺序

对应属性,可以通过主构造函数、类属性、初始化代码块、和次级构造函数,来进行初始化。

那么他们的执行顺序就是上面这个顺序。这个执行顺序要牢记,很关键,有可能会踩到坑。

4.延迟初始化

通过 lateinit这个关键字,实现延迟初始化。属性可以在声明时,不必赋初始值。但是在使用前必须赋值。可以通过::hobby.isInitialized 这个来判断是否初始化完成。

    lateinit var hobby:String
    fun initHobby(){
        hobby="game"
    }
    fun isInit():Boolean{
        //判断属性是否初始化
        return ::hobby.isInitialized
    }

5.惰性初始化

通过by lazy可以实现惰性初始化。属性声明时不必赋值,使用这个属性时,会自动初始化。

    val lazy by lazy { lazyinit() }
    private fun lazyinit() :Boolean{
        println("lazy init")
        return true
    }

到此这篇关于Kotlin类与属性及构造函数的使用详解的文章就介绍到这了,更多相关Kotlin类 属性 构造函数内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     801人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     348人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     311人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     432人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     220人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-移动开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯