Kotlin - 类成员

简介: Kotlin - 类成员

本系列学习教程笔记属于详细讲解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 是成员属性,使用 varval 声明的构造器参数 name 也会成为类成员属性。

#函数与方法

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

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

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

fun main(args: Array<String>) {
    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 也支持属性延迟初始化,但 varval 的延迟初始化写法完全不同,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<String>) {
    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<String>) {
    val a = AClass()
    println("init a") // init a

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

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

  • 属性的初始化尽量在构造方法中完成
  • 无法在构造方法中初始化,尝试降级为局部变量
  • var 用 lateinit 延迟初始化,val 用 lazy
  • 可空类型慎用 null 直接初始化
相关文章
|
5天前
|
存储 人工智能 弹性计算
阿里云弹性计算_加速计算专场精华概览 | 2024云栖大会回顾
2024年9月19-21日,2024云栖大会在杭州云栖小镇举行,阿里云智能集团资深技术专家、异构计算产品技术负责人王超等多位产品、技术专家,共同带来了题为《AI Infra的前沿技术与应用实践》的专场session。本次专场重点介绍了阿里云AI Infra 产品架构与技术能力,及用户如何使用阿里云灵骏产品进行AI大模型开发、训练和应用。围绕当下大模型训练和推理的技术难点,专家们分享了如何在阿里云上实现稳定、高效、经济的大模型训练,并通过多个客户案例展示了云上大模型训练的显著优势。
|
9天前
|
存储 人工智能 调度
阿里云吴结生:高性能计算持续创新,响应数据+AI时代的多元化负载需求
在数字化转型的大潮中,每家公司都在积极探索如何利用数据驱动业务增长,而AI技术的快速发展更是加速了这一进程。
|
6天前
|
人工智能 运维 双11
2024阿里云双十一云资源购买指南(纯客观,无广)
2024年双十一,阿里云推出多项重磅优惠,特别针对新迁入云的企业和初创公司提供丰厚补贴。其中,36元一年的轻量应用服务器、1.95元/小时的16核60GB A10卡以及1元购域名等产品尤为值得关注。这些产品不仅价格亲民,还提供了丰富的功能和服务,非常适合个人开发者、学生及中小企业快速上手和部署应用。
|
14天前
|
人工智能 弹性计算 文字识别
基于阿里云文档智能和RAG快速构建企业"第二大脑"
在数字化转型的背景下,企业面临海量文档管理的挑战。传统的文档管理方式效率低下,难以满足业务需求。阿里云推出的文档智能(Document Mind)与检索增强生成(RAG)技术,通过自动化解析和智能检索,极大地提升了文档管理的效率和信息利用的价值。本文介绍了如何利用阿里云的解决方案,快速构建企业专属的“第二大脑”,助力企业在竞争中占据优势。
|
16天前
|
自然语言处理 数据可视化 前端开发
从数据提取到管理:合合信息的智能文档处理全方位解析【合合信息智能文档处理百宝箱】
合合信息的智能文档处理“百宝箱”涵盖文档解析、向量化模型、测评工具等,解决了复杂文档解析、大模型问答幻觉、文档解析效果评估、知识库搭建、多语言文档翻译等问题。通过可视化解析工具 TextIn ParseX、向量化模型 acge-embedding 和文档解析测评工具 markdown_tester,百宝箱提升了文档处理的效率和精确度,适用于多种文档格式和语言环境,助力企业实现高效的信息管理和业务支持。
3936 2
从数据提取到管理:合合信息的智能文档处理全方位解析【合合信息智能文档处理百宝箱】
|
5天前
|
算法 安全 网络安全
阿里云SSL证书双11精选,WoSign SSL国产证书优惠
2024阿里云11.11金秋云创季活动火热进行中,活动月期间(2024年11月01日至11月30日)通过折扣、叠加优惠券等多种方式,阿里云WoSign SSL证书实现优惠价格新低,DV SSL证书220元/年起,助力中小企业轻松实现HTTPS加密,保障数据传输安全。
507 3
阿里云SSL证书双11精选,WoSign SSL国产证书优惠
|
12天前
|
安全 数据建模 网络安全
2024阿里云双11,WoSign SSL证书优惠券使用攻略
2024阿里云“11.11金秋云创季”活动主会场,阿里云用户通过完成个人或企业实名认证,可以领取不同额度的满减优惠券,叠加折扣优惠。用户购买WoSign SSL证书,如何叠加才能更加优惠呢?
987 3
|
9天前
|
机器学习/深度学习 存储 人工智能
白话文讲解大模型| Attention is all you need
本文档旨在详细阐述当前主流的大模型技术架构如Transformer架构。我们将从技术概述、架构介绍到具体模型实现等多个角度进行讲解。通过本文档,我们期望为读者提供一个全面的理解,帮助大家掌握大模型的工作原理,增强与客户沟通的技术基础。本文档适合对大模型感兴趣的人员阅读。
419 18
白话文讲解大模型| Attention is all you need
|
4天前
|
数据采集 人工智能 API
Qwen2.5-Coder深夜开源炸场,Prompt编程的时代来了!
通义千问团队开源「强大」、「多样」、「实用」的 Qwen2.5-Coder 全系列,致力于持续推动 Open Code LLMs 的发展。
|
9天前
|
算法 数据建模 网络安全
阿里云SSL证书2024双11优惠,WoSign DV证书220元/年起
2024阿里云11.11金秋云创季火热进行中,活动月期间(2024年11月01日至11月30日),阿里云SSL证书限时优惠,部分证书产品新老同享75折起;通过优惠折扣、叠加满减优惠券等多种方式,阿里云WoSign SSL证书将实现优惠价格新低,DV SSL证书220元/年起。
562 5