Android面试题之Kotlin的几种常见的类

本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点

初始化的顺序
  1. 主构造函数里声明的属性

  2. 类级别的属性赋值

  3. init初始化块里的属性赋值和函数调用

  4. 次构造函数里的属性赋值和函数调用

延迟初始化
  • lateinit关键字用来延迟初始化

  • isInitialized可以检查是否初始化完成

class classtest {
    var name = "Java"
    lateinit var code:String

    fun ready() {
        code  = "hahah"
    }
    
    fun go() {
        if (::code.isInitialized) {
            println(code)
        }
    }
}
惰性初始化

只有在用到时才会初始化

val config by lazy { loadConfig() }
private fun loadConfig():String {
    println("loading...")
    return "ccc"
}
lateinit和by lazy
  • lateinit只修饰var,lazy修饰val

  • lateinit var只能用来修饰类属性,不能用来修饰局部变量,并且只能用来修饰对象,不能用来修饰基本类型(因为基本类型的属性在类加载后的准备阶段都会被初始化为默认值)。

  • lateinit var让编译期在检查时不要因为属性变量未被初始化而报错,也就是去掉了属性上的@NotNull修饰

  • by lazy后面的表达式只在第一次调用时执行一次,后续只返回结果

  • by lazy可以使用于类属性或者局部变量

  • by lazy初始化操作是线程安全的

初始化注意点
  • 使用初始化块时,顺序非常重要,必须确保块中的所有属性已经完成初始化

  • 初始化块中的函数里所用到得属性,也要确保已经初始化完成

  • 类里面的属性按从上往下顺序初始化,在调用方法函数时,一定要确保属性已经初始化完成

继承
  • 默认不可继承,如果要开放,需要open关键字

  • 可以被覆写的方法也要open关键字修饰

  • 用 is 来判断类型,用as来手动转换类型,并且kotlin可以进行智能类型转换

  • Any类是所有类的超类

open class Product(val name:String) {
    fun des() = "Product: $name"
   open fun load() = "Nothing..."
}

class Normal : Product("normal"){
    override fun load() = "normal loading..."
    fun special() = "special"
}

fun main() {
    val p:Product = Normal()
    println(p.load())
    println(p is Product)
    println(p is Normal)

//    if (p is Normal) {
        println((p as Normal).special())
//    }
    //智能类型转换,不需要再as
    println(p.special())
}
嵌套类

如果一个类只对另一个类有用,那么将其嵌入到该类中并使这2各类保持在一起是合理的

class Student {
    class Study {
        fun study(){
            println("study...")
        }
    }
}
fun main() {

    //嵌套类
    Student.Study().study()
}
数据类
  • data修饰符

  • 实现了toString方法,equals方法和hashcode方法,==符号比较的是属性值

  • 实现了copy函数,调用copy函数会生成一个新对象,构造方法走的是主构造方法,不会走次构造方法,也就是次构造函数里初始化的属性不会copy过来

  • 支持解构语法

  • 支持运算符重载

数据类使用条件
  • 经常需要比较、复制或打印自身内容的类,数据类尤其适合

  • 数据类必须有至少带一个参数的主构造函数

  • 主构造函数的参数必须是val或是var

  • 数据类不能使用abstract open sealed和inner修饰符

data class Coordinate(var x:Int, var y:Int){
    val isInBounds = x>0 && y>0
    //运算符重载
    operator fun plus(other:Coordinate) = Coordinate(x + other.x, y+other.y)
}

fun main() {
    println(Coordinate(10,19))
    //解构语法
    val (x,y) = Coordinate(10,20)
    println("$x,$y")
    
    //运算符重载
    val c1 = Coordinate(10,20)
    val c2 = Coordinate(10,20)
    println(c1+c2)
}
单例类
  • 使用object关键字可以定义单例类

object关键字有三种使用方式

  • 对象声明,生成单例

  • 对象表达式,就类似匿名内部类,new onClickListener

  • 伴生对象,类似静态方法或是静态属性

枚举类
  • 定义常量集合,也可以定义函数

  • when表达式不需要else

enum class Direction(private val coordinate: Coordinate){
    EAST(Coordinate(1,0)),
    WEST(Coordinate(-1,0)),
    SOURCE(Coordinate(-1,0)),
    NORTH(Coordinate(1,0));

    fun update(playCoordinate: Coordinate): Coordinate {
        return Coordinate(playCoordinate.x+coordinate.x, playCoordinate.y+coordinate.y)
    }
}

fun main() {
    println(Direction.EAST)
    println(Direction.EAST.update(Coordinate(10,20)))
}
密封类
  • 密封类可以用来定义一个类似枚举类的代数数据类型,但你可以更灵活地控制某个子类型

  • 密封类可以有若干个子类,要继承密封类,这些子类必须和它定义在同一个文件里

sealed class LicenseStatus{
    //2个单例类
    object UnQualified:LicenseStatus()
    object Learining:LicenseStatus()
    //一个普通类,都是LicenseStatus的子类
    class Qualified(val licenseId:String) : LicenseStatus()
}

class Driver(var status: LicenseStatus){
    fun checkLicense():String{
        return when(status){
            is LicenseStatus.UnQualified -> "没资格"
            is LicenseStatus.Learining -> "学习中"
            is LicenseStatus.Qualified -> "有资格,编号:${(this.status as LicenseStatus.Qualified).licenseId}"
        }
    }
}

fun main() {
    val status = LicenseStatus.Qualified("1234")
    val driver = Driver(status)
    println(driver.checkLicense())
}

欢迎关注我的公众号查看更多精彩文章!

AntDream

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/631799.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Chirpstack配合网关与lora设备通信

之前的章节讲过chirpstack的下载和安装部署,这节算是后续,利用chirpstack和lora设备做通信, 首先开启chirpstack,并登录,登录完成之后需要添加网关和设备,添加网关也就是Gatway,所以点开左侧的G…

搜索二维矩阵 - LeetCode 热题 64

大家好!我是曾续缘🧡 今天是《LeetCode 热题 100》系列 发车第 64 天 二分查找第 2 题 ❤️点赞 👍 收藏 ⭐再看,养成习惯 搜索二维矩阵 给你一个满足下述两条属性的 m x n 整数矩阵: 每行中的整数从左到右按非严格递增…

激光切割机哪家可靠?

激光切割机哪家可靠?市面上的激光切割机牌子很多,具体什么牌子好,建议综合考虑一下企业成立时间、技术实力、设备工艺做工、售后服务,一般成立时间长,设备装配经验丰富,售后服务完善的企业,能够…

深度学习之卷积神经网络理论基础

深度学习之卷积神经网络理论基础 卷积层的操作(Convolutional layer) 在提出卷积层的概念之前首先引入图像识别的特点 图像识别的特点 特征具有局部性:老虎重要特征“王字”仅出现在头部区域特征可能出现在任何位置下采样图像&#xff0c…

银行业数据分析专家视角:业务场景中的深度解析与应用

一、引言 在数字化和大数据时代的浪潮下,银行业正经历着前所未有的变革。作为数据分析领域的资深专家,我深知数据分析在银行业务发展中的重要性和价值。本文将从银行业数据分析的角度出发,深入探讨相关业务场景下的数据分析应用,…

Linux 操作系统MySQL 数据库指令

1.MySQL 数据库 数据库是“按照数据结构来组织、 存储和管理数据的仓库”。 是一个长期存储在计算机内的、 有组织的、 可共享的、 统一管理的大量数据的集合。 它的存储空间很大, 可以存放百万条、 千万条、 上亿条数据。 但是数据库并不是随意地将数据进行…

[vue] nvm use时报错 exit status 1:一堆乱码,exit status 5

报错exit status 5:�ܾ����ʡ� 原因:因为当前命令提示符窗口是user权限, 解决:cmd使用管理员方式打开就可以 参考: vm use时报错 exit status 1…

24长三角A题思路+分析选题

需要资料的宝子们可以进企鹅获取 A题 问题1:西湖游船上掉落华为 mate 60 pro 手机 1. 手机掉落范围分析 物品特征:华为 mate 60 pro 手机的尺寸、重量、形状等特性。静水假设:西湖水面平静,不考虑水流影响。掉落位置&#xff…

Linux基础之进程的优先级

目录 一、进程优先级的概念 二、进程优先级的查看 三、怎么修改进程优先级 四、进程饥饿 一、进程优先级的概念 cpu资源分配的先后顺序,就是指进程的优先权(priority)。优先权高的进程有优先执行权利。配置进程优先权对多任务环境的linu…

从零入门激光SLAM(十七)——SLAM中为什么用ESKF误差卡尔曼滤波器

上一节,介绍了卡尔曼滤波的基本原理,但在SLAM中却使用ESKF,让我们一起看看具体的原因是什么吧 一、误差卡尔曼滤波器ESKF(Error State Kalman Filter) 1.1动机 在常规的卡尔曼滤波器中,需要假定系统的状态服从高斯分布&#xf…

语法分析-文法

如果对于一部文法中,存在至少一个句子有两个或者两个以上的语法树则该文法是二义性的。 我们可以以上面的例子进行解释,对于第棵个语法树,我们可以看到是先进行了加法运算再进行的乘法运算,因为需要先把EE作为整体运算完后再成为E…

github新手用法

目录 1,github账号注册2,github登录3,新建一个仓库4,往仓库里面写入东西或者上传东西5, 下载Git软件并安装6 ,获取ssh密钥7, 绑定ssh密钥8, 测试本地和github是否联通9,从…

研发数据在企业内部多重传输场景,怎样才能有效响应?

研发数据因行业不同包含的种类各异,主要有设计和仿真数据、研发投入、进展和成果数据、生产过程数据、维护和保养数据、质量数据等,企业研发数据对企业而言具有至关重要的意义。特别是以研发为核心业务及定位的企业, 如半导体 IC 设计、生物制…

淘宝购物必备神器,淘宝商品评论电商API接口告诉你真实惠品质好!

众所周知,淘宝作为国内最大的电商平台,拥有数以亿计的商品以及海量的评论。然而,由于淘宝上的商品数量庞大,品质参差不齐,买家往往难以决策。此外,有些商品的评论可信度也受到一定的质疑,很难了…

SSM框架打造的高效稳定网上购物商城管理系统

作者介绍:✌️大厂全栈码农|毕设实战开发,专注于大学生项目实战开发、讲解和毕业答疑辅导。 🍅获取源码联系方式请查看文末🍅 推荐订阅精彩专栏 👇🏻 避免错过下次更新 Springboot项目精选实战案例 更多项目…

冯喜运:5.16黄金多头或挑战2400关口,原油最新行情分析

【黄金消息面分析】:在最新数据显示通胀回落和零售销售疲软后,交易员评估美联储转向货币宽松的时机和幅度,黄金市场出现了一些新的动力。根据周三(5月15日)公布的数据,衡量美国潜在通胀的指标4月份出现六个…

C++进阶之路:何为默认构造函数与析构函数(类与对象_中篇)

✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨ 🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢,在这里我会分享我的知识和经验。&am…

用AI帮你写简历,入职啦简历编辑器

简历的重要性 在当前就业形势严峻、竞争加剧的背景下,获取理想工作的难度与日俱增。此时,一份精心准备、亮点突出的简历,成为了您脱颖而出、成功获得面试机会乃至工作offer的关键。面对HR有限的审阅时间和众多应聘者的激烈角逐,如…

【高阶数据结构(四)】图的最短路径问题

💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:高阶数据结构专栏⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你学习更多数据结构   🔝🔝 高阶数据结构 1. 前言2. 单源最短…

STAR-Echo:一种使用时空分析和基于Transformer的影像组学模型预后慢性肾脏病患者 MACE 预后的新型生物标志物

文章目录 STAR-Echo: A Novel Biomarker for Prognosis of MACE in Chronic Kidney Disease Patients Using Spatiotemporal Analysis and Transformer-Based Radiomics Models摘要方法实验结果 STAR-Echo: A Novel Biomarker for Prognosis of MACE in Chronic Kidney Disease…