当前位置: 首页 > news >正文

Kotlin(九)类、属性、构造函数

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
    }

相关文章:

  • Java 八股文能不背吗?Java 面试都只是背答案吗?
  • [CC2642R1][VSCODE+Embedded IDE+IAR Build+Cortex-Debug] TI CC2642R1基于VsCode的开发环境
  • JS垃圾回收与内存泄漏
  • MySQL数据库笔记
  • 基于SSM的高校餐厅防疫管理系统
  • y118.第七章 服务网格与治理-Istio从入门到精通 -- Istio流量治理快速入门(四)
  • Linux | 性能问题排查
  • 【微服务容器化】第二章-Docker常用命令
  • 慧差\畸变 zemax示例
  • 硬件控制方法
  • 【单细胞高级绘图】08.细胞通讯_两组比较_气泡图
  • java计算机毕业设计基于安卓Android/微信小程序的校园报修管理APP
  • Mysql 的安装
  • 8.【外部排序】基本概念和方法 + 优化:【败者树】{减少关键字对比次数}、【置换-选择 排序】{减少初始归并段数量}、【最佳归并树】{谁先合并更快}
  • Python装饰器通俗理解
  • ----------
  • 【391天】每日项目总结系列128(2018.03.03)
  • Electron入门介绍
  • Gradle 5.0 正式版发布
  • js递归,无限分级树形折叠菜单
  • passportjs 源码分析
  • Spring核心 Bean的高级装配
  • v-if和v-for连用出现的问题
  • vue总结
  • XForms - 更强大的Form
  • 可能是历史上最全的CC0版权可以免费商用的图片网站
  • 一个普通的 5 年iOS开发者的自我总结,以及5年开发经历和感想!
  • 职业生涯 一个六年开发经验的女程序员的心声。
  • AI算硅基生命吗,为什么?
  • python最赚钱的4个方向,你最心动的是哪个?
  • TPG领衔财团投资轻奢珠宝品牌APM Monaco
  • ​​​​​​​sokit v1.3抓手机应用socket数据包: Socket是传输控制层协议,WebSocket是应用层协议。
  • ​ssh-keyscan命令--Linux命令应用大词典729个命令解读
  • # 数据结构
  • #、%和$符号在OGNL表达式中经常出现
  • #etcd#安装时出错
  • (C语言)求出1,2,5三个数不同个数组合为100的组合个数
  • (M)unity2D敌人的创建、人物属性设置,遇敌掉血
  • (附源码)ssm户外用品商城 毕业设计 112346
  • (九)One-Wire总线-DS18B20
  • (七)Java对象在Hibernate持久化层的状态
  • (区间dp) (经典例题) 石子合并
  • (已解决)vue+element-ui实现个人中心,仿照原神
  • (转)c++ std::pair 与 std::make
  • (轉貼) VS2005 快捷键 (初級) (.NET) (Visual Studio)
  • .NET Core 和 .NET Framework 中的 MEF2
  • .Net Memory Profiler的使用举例
  • .NET(C#、VB)APP开发——Smobiler平台控件介绍:Bluetooth组件
  • .NET/C# 将一个命令行参数字符串转换为命令行参数数组 args
  • .netcore 如何获取系统中所有session_如何把百度推广中获取的线索(基木鱼,电话,百度商桥等)同步到企业微信或者企业CRM等企业营销系统中...
  • .NET上SQLite的连接
  • .net图片验证码生成、点击刷新及验证输入是否正确
  • @RequestParam @RequestBody @PathVariable 等参数绑定注解详解
  • @Valid和@NotNull字段校验使用
  • @vue/cli脚手架