kotlin属性和变量
来源:互联网 发布:java 如何打包jar文件 编辑:程序博客网 时间:2024/06/06 12:44
属性声明
• var 可变变量
• val 不可变变量
• vararg 可变参数(类似于Java中String…,用于参数声明,这里一起放上)
类中声明的属性必须得初始化,否则编译报错。或者将此属性用abstract修饰符修饰。在abstract修饰的属性值,即使不用初始化,必须声明其数据类型,并在其子类初始化。
abstract class Person { abstract var name: String var age: Int = 10 val sex: String = "M" private var mobile: String = "606066"}
编译器会自动生成getter和setter方法。所以上面的属性编译器默认添加了getter和setter方法。
属性的Getter和Setter
Getter和Setter
声明属性时,编辑器会自动生成getter和setter方法,这其实偷懒的方式,并不是完整的属性声明。 完整的属性的声明如下:
var <propertyName>: <PropertyType> [= <property_initializer>][<getter>][<setter>]
其中initializer, getter 和 setter都是可选的。var是允许有getter 和 setter方法,如果变量是val声明的,如果是val只有getter而没有setter方法,因为val的值是不可变的。
对于属性,如果你想改变访问的可见性或者是对其进行注解,但是又不想改变它的默认实现,那么你就可以定义set和get但不进行实现。
var setterVisibility: String = "abc"private set // 设值方法的可见度为 private, 并使用默认实现,使用时不能设置值var setterWithAnnotation: Any? = null@Inject set // 对设值方法添加 Inject 注解
Getter和Setter方法,可以根据实际情况自定义。
class People { var lastName: String = "zhang" get() = field.toUpperCase() set var no: Int = 100 get() = field set(value) { if (value < 10) { field = value } else { field = -1 } } var heiht: Float = 145.4f private set}
自定义getter/setter重点在field,跟我们熟悉所Java的this指代当前类一样,field指代当前参数。“field”后续还会提到。
注意:
- getter方法的可见性与属性的可见性一致。假如声明一个public变量,将其的getter方法用其他修饰符修饰,会报错。
- setter方法可以自定义修饰符,在实例代码中就可以看到,此时setter的修饰符不一定与属性的修饰符一致,其使用范围由修饰符决定,并不一定与属性的适用范围一致。
Backing Fields(支持域)
由于Kotlin中,并不允许使用局部变量,使用编辑器的自定义的访问器时,就要用到刚才提到的“field”了,其实际上Kotlin提供的一种Backing Fields,由field标识符来访问。
编译器会检查属性访问器的函数体, 如果使用了后端域变量(或者,如果没有指定访问器的函数体, 使用了默认实现), 编译器就会生成一个后端域变量, 否则, 就不会生成后端域变量。
val isEmpty: Booleanget() = this.size == 0
这是官方文档的一个例子,在访问属性值isEmpty时,并不会生成后端变量,因为其值是由其实例的长度决定的,并不需要一个后端域变量进行过度。
注意:field 标识符只允许在属性的访问器函数内使用。
Backing Property
支持属性与支持域(Backing Fields)类似,其针对的是属性值的初始化声明,避免空指针的一种措施。
private var _table: Map<String, Int>? = nullpublic val table: Map<String, Int>get() { if (_table == null) _table = HashMap() // 类型参数可以自动推断得到, 不必指定 return _table ?: throw AssertionError("Set to null by another thread")}
在Java中访问private成员变量需要通过getters和setters,这里通过table还获取_table,,优化了Java中函数调用的开销。
延迟初始化属性
在类内声明的属性必须初始化,如果设置非NULL的属性,应该将此属性在构造器内进行初始化。假如想在类内声明一个NULL属性,在需要时再进行初始化,与Kotlin的规则是相背的,此时我们可以声明一个属性并延迟其初始化,此属性用lateinit修饰符修饰。
class MyInfo { lateinit var person: Person fun initData() { person = Person() }}fun main(args: Array<String>) { val myInfo: MyInfo = MyInfo() myInfo.initData() myInfo.person.doSwim()}
代理属性
通过lazy关键字实现懒加载方式
class KotlinActivity : AppCompatActivity() { private val aTextView by lazy { findViewById(R.id.textview) as TextView } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_demo)// textview = findViewById(R.id.textview) as TextView?// textview?.textSize = 20f// textview?.text = "hello" aTextView.text = "hello" aTextView.textSize = 20f }}
lazy 是 Kotlin 的属性代理的一个实例,它提供了延迟加载的机制。换句话说,这里的 lazy 提供了初始化 aTextView 的方法,不过真正初始化这个动作发生的时机却是在 aTextView 第一次被使用时了。关于代理机制后续文章介绍。
参考文章:Properties and Fields
- Kotlin 变量和属性
- kotlin属性和变量
- Kotlin变量和属性(五)
- Hello Kotlin(四)变量和属性
- Kotlin属性和变量-2.2-Properties and Fields
- Kotlin 变量和方法
- Kotlin-属性和字段
- Kotlin 属性和域
- Kotlin 字段和属性
- Kotlin开发Android笔记4:Kotlin中变量及属性
- kotlin的变量和函数
- Kotlin基础教程-属性和字段
- Kotlin——程序的灵魂组成之变量、属性和函数的基本语法(一)
- android使用kotlin开发基础(二)变量跟属性
- Kotlin学习系列----定义变量及基本属性
- kotlin学习笔记——类型、变量、属性
- Kotlin语法(七)-属性和字段
- Kotlin学习(三): 属性和字段
- 导出流程图
- 构建学生请假审批流程
- 1022. Digital Library (30)
- maven项目的单元测试和遇到的问题
- EXCEL导入导出
- kotlin属性和变量
- Zookeeper实例Curator API-Master选举
- linux文本处理三剑客之grep
- css背景与列表样式使用
- mysql基础
- Spring 入门
- springMVC 利用拦截器防止sql注入
- spring的生命周期
- 初学c++之一维数组