kotlin-属性的学习

前言

五一小长假结束,正好赶上周末这周要上七天的班呀哈哈

声明属性

在kotlin类中的属性既可以使用关键在var 声明为可变,也可以用val关键字声明为只读

class Address {

    var name: String = "栾桂明"
    var street: String = "通达街"
    var city: String = "哈尔滨"
    var state:String? = "普通公民"
    val age:Int = 25
}

要使用一个属性,只要用名称引用它即可,就像java中的字段:


fun copyAddress(address: Address): Address {
    val result = Address()
    result.name = address.name
    result.city = address.city
    result.state = address.state
    result.street = address.street
    return address

}

Getters与Setters

声明一个属性的完整语法是:
在这里插入图片描述
其初始化器,getter,setter都是可选的。属性的类型是可以从初始化器中推断出来的,也可以省略


// var allByDefault:Int? 错误:需要显示的初始化器,隐含默认 getter 和 setter
   var initialized = 1 // 类 Int  默认 getter 和 setter
  • 只读属性和可变属性的区别

一个只读属性的语法和一个可变属性的语法有两个方面的不同:1 只读属性用val代替var 2 只读属性没有setter

  • 自定义访问器
    我们可以为属性定义自定义的访问器。如果我们定义了一个自定义的getter,那么每次访问这个属性的时候都会调用它
// getter 的使用
val isEmpty get() = "xiaohei".isEmpty()
val name:String
   get() = "name is xiaohei"
//setter方法的使用
 var age:String
   get()= "26"
   set(value){
       "栾小黑的年龄是 25"
   }
// 测试使用的主函数
fun main(args: Array<String>) {
    println(name)
    println(age)
}

  • 幕后字段
    在kotlin类中不能直接声明字段,然而,当一个属性需要幕后字段的时候,kotlin 会自动提供。这个幕后字段可以使用 field标识符在访问器中应用:
var counter = 0
   set(value){
       if (value>0) field = value
   }

fun main(args: Array<String>) {
    counter = 12
    println("setter方法的使用"+counter)
}
  • 幕后属性
private var _table: Map<String, Int>? = null
public val table: Map<String, Int>
    get() {
        if (_table == null) {
            _table = HashMap() // 类型参数已推断出
        }
        return _table ?: throw AssertionError("Set to null by another thread")
    }

这里不是很懂

编译器常量

已知值的属性可以使用const修饰符标记为 编译器常量。这些属性要满足一下需求

  • 一个位于顶层或者是object声明或者是companion object 的成员
  • 以String或原声类型值初始化
  • 没自定义的getter
const val XIAOHEI= “this is  a handsome boy”

延迟初始化属性和变量

一般地,属性声明为非空类型必须在构造函数中初始化。 然而,这经常不方便。例如:属性可以通过依赖注入来初始化, 或者在单元测试的 setup 方法中初始化。 这种情况下,你不能在构造函数内提供一个非空初始器。 但你仍然想在类体中引用该属性时避免空检查
为处理这种情况,你可以用 lateinit 修饰符标记该属性:

    lateinit var subject: TestSubject

该修饰符只能用于在类体中的属性(不是在主构造函数中声明的 var 属性,并且仅当该属性没有自定义 getter 或 setter 时),而自 Kotlin 1.2 起,也用于顶层属性与局部变量。该属性或变量必须为非空类型,并且不能是原生类型。

在初始化前访问一个 lateinit 属性会抛出一个特定异常,该异常明确标识该属性被访问及它没有初始化的事实。

检测一个lateinit var 是否已经初始化

if (foo::bar.isInitialized) {
    println(foo.bar)
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值