Kotlin语法 - 类成员

简介: 本教程详细讲解Kotlin语法,适合深入学习。若需快速掌握,推荐“简洁”系列教程。内容涵盖类成员、函数与方法、属性访问控制及初始化等。类成员包括方法和属性,函数独立于类,属性访问通过getter/setter实现,支持延迟初始化。

本系列学习教程笔记属于详细讲解Kotlin语法的教程,需要快速学习Kotlin语法的小伙伴可以查看“简洁” 系列的教程

快速入门请阅读如下简洁教程:
Kotlin学习教程(一)
Kotlin学习教程(二)
Kotlin学习教程(三)
Kotlin学习教程(四)
Kotlin学习教程(五)
Kotlin学习教程(六)
Kotlin学习教程(七)
Kotlin学习教程(八)
Kotlin学习教程(九)
Kotlin学习教程(十)

imgKotlin - 类成员

类成员

类成员包括 成员方法 和 成员属性:

class Artist(var name: String) { // 成员属性 name

var age = 18 // 成员属性 age

fun dance(danceName: String) { // 成员方法 dance
    println("$name 正在跳 $danceName")
}

fun sing(singName: String) { // 成员方法 sing
    println("$name 正在唱 $singName")
}

}
类中的 dance 和 sing 是成员方法,age 是成员属性,使用 var 或 val 声明的构造器参数 name 也会成为类成员属性。

函数与方法

函数与方法形式一致,区别是方法在类中,函数则不是,因此,方法需要通过类名或对象来调用,而函数则是直接使用。

函数强调功能本身,不考虑从属。

// 函数
fun sayHello() {
println("hello")
}

fun main(args: Array) {
val artist = Artist("lqr")
artist.dance("恰恰") // 调用对象 artist 的 dance 方法
artist.sing("龙卷风") // 调用对象 artist 的 sing 方法
sayHello() // 调用函数
}

属性访问控制

先来看个访问对象属性的例子:

class AClass {
var b = 0
}
fun main() {
val a = AClass()
a.b = 666
println(a.b) // 666
}
Kotlin 中,对象访问属性实质上都是使用 getter/setter ,而并非直接访问属性对其赋值。这可以通过重写属性的 getter/setter 来验证:

class AClass {
var b = 0
get() {
println("some one tries to get b.")
return field
}
set(value) {
println("some one tries to set b.")
field = value
}
}

fun main() {
val a = AClass()
a.b = 666 // some one tries to set b.
println(a.b) // some one tries to get b.
// 666
}
getter/setter 中使用属性时,需要用 field 来指代,避免出现代码歧义。

注意:val 常量没有 setter,因为 val 是不可变的!

默认属性的 getter/setter 的访问权限是 public,可以对其重写修改:

class AClass {
var b = 0
protected get // IDE报错:Getter visibility must be the same as property visibility
protected set
}
如果修改了 getter 的访问权限,就需要对属性声明做同样的修改,于是,正确的写法是:

class AClass {
protected var b = 0
protected get
protected set
}

属性初始化

Kotlin 中一般成员属性在声明时就需要初始化:

class AClass {
var b = 0
var c: String? = null
// var c: String? // IDE报错:Property must be initialized or be abstract
}
Kotlin 也支持属性延迟初始化,但 var 和 val 的延迟初始化写法完全不同,var 变量使用 lateinit:

class X
class AClass {
lateinit var c: String
lateinit var d: X
// lateinit val e:X // IDE报错:'lateinit' modifier is allowed only on mutable properties
}

fun main(args: Array) {
val a = AClass()

a.d = X()
println(a.d) // com.charylin.kotlinlearn.X@214c265e

println(a.c) // lateinit property c has not been initialized

}
lateinit 只能与 var 搭配,不能与 val 一起使用。
lateinit var 变量在使用前一定要确保已经初始化,否则报错:lateinit property c has not been initialized。
说完 lateinit var ,再来看看 val 常量的延迟初始化,使用的是 by lazy,作用是 "使用时加载":

class X
class AClass {
// val e: X by lazy {} // IDE报错:Type mismatch. Required:X Found: Unit
val e: X by lazy {
println("init X")
X()
}
}

fun main(args: Array) {
val a = AClass()
println("init a") // init a

println(a.e) // init X
             // com.charylin.kotlinlearn.X@3d075dc0

}
关于属性初始化的几点建议:

属性的初始化尽量在构造方法中完成
无法在构造方法中初始化,尝试降级为局部变量
var 用 lateinit 延迟初始化,val 用 lazy
可空类型慎用 null 直接初始化

相关文章
|
19天前
|
Kotlin
Kotlin教程笔记(20) - 枚举与密封类
Kotlin教程笔记(20) - 枚举与密封类
36 8
|
20天前
|
Java Kotlin
Kotlin教程笔记(13) - 类及成员的可见性
Kotlin教程笔记(13) - 类及成员的可见性
32 3
|
20天前
|
Java Kotlin Python
​ Kotlin教程笔记(16) - 扩展成员
​ Kotlin教程笔记(16) - 扩展成员
|
20天前
|
存储 前端开发 Java
Kotlin教程笔记(18) - 数据类
Kotlin教程笔记(18) - 数据类
|
23天前
|
数据安全/隐私保护 Kotlin
Kotlin教程笔记(7) - 类成员
Kotlin教程笔记(7) - 类成员
|
Java Kotlin
Kotlin语法(基础)
一、基础语法: 1. 定义包名: 包名应该在源文件的最开头,包名不必和文件夹路径一致:源文件可以放在任意位置。 package my.demo 2. 定义函数: fun sum(a: Int , b: Int) : Int{   return a + b } 表达式函数体自动推断型的返回值: fun...
783 0
|
2月前
|
JSON 调度 数据库
Android面试之5个Kotlin深度面试题:协程、密封类和高阶函数
本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点。文章详细解析了Kotlin中的协程、扩展函数、高阶函数、密封类及`inline`和`reified`关键字在Android开发中的应用,帮助读者更好地理解和使用这些特性。
34 1
|
3月前
|
Android开发 开发者 Kotlin
告别AsyncTask:一招教你用Kotlin协程重构Android应用,流畅度飙升的秘密武器
【9月更文挑战第13天】随着Android应用复杂度的增加,有效管理异步任务成为关键。Kotlin协程提供了一种优雅的并发操作处理方式,使异步编程更简单直观。本文通过具体示例介绍如何使用Kotlin协程优化Android应用性能,包括网络数据加载和UI更新。首先需在`build.gradle`中添加coroutines依赖。接着,通过定义挂起函数执行网络请求,并在`ViewModel`中使用`viewModelScope`启动协程,结合`Dispatchers.Main`更新UI,避免内存泄漏。使用协程不仅简化代码,还提升了程序健壮性。
103 1
|
4月前
|
调度 Android开发 开发者
【颠覆传统!】Kotlin协程魔法:解锁Android应用极速体验,带你领略多线程优化的无限魅力!
【8月更文挑战第12天】多线程对现代Android应用至关重要,能显著提升性能与体验。本文探讨Kotlin中的高效多线程实践。首先,理解主线程(UI线程)的角色,避免阻塞它。Kotlin协程作为轻量级线程,简化异步编程。示例展示了如何使用`kotlinx.coroutines`库创建协程,执行后台任务而不影响UI。此外,通过协程与Retrofit结合,实现了网络数据的异步加载,并安全地更新UI。协程不仅提高代码可读性,还能确保程序高效运行,不阻塞主线程,是构建高性能Android应用的关键。
65 4
|
5月前
|
安全 Android开发 Kotlin
Android经典面试题之Kotlin延迟初始化的by lazy和lateinit有什么区别?
**Kotlin中的`by lazy`和`lateinit`都是延迟初始化技术。`by lazy`用于只读属性,线程安全,首次访问时初始化;`lateinit`用于可变属性,需手动初始化,非线程安全。`by lazy`支持线程安全模式选择,而`lateinit`适用于构造函数后初始化。选择依赖于属性特性和使用场景。**
180 5
Android经典面试题之Kotlin延迟初始化的by lazy和lateinit有什么区别?