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

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

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

  2. 类级别的属性赋值

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

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

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

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

class classtest {var name = "Java"lateinit var code:Stringfun 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())
//    }//智能类型转换,不需要再asprintln(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

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【半监督学习】半监督学习中的时间集合

在本文中,我们提出了一种在半监督环境下训练深度神经网络的简单而高效的方法,在这种环境下,只有一小部分训练数据是有标签的。我们引入了self-ensembling技术,即利用网络在不同历时,最重要的是在不同正则化和输入增强条…

刷代码随想录有感(66):回溯算法——组合问题的优化(剪枝)

代码&#xff1a;将for循环中i的搜索范围进行缩小&#xff0c;免去多余的不可能符合条件的操作。 for(int i start; i < n-(k-tmp.size())1;i) 实质是剪枝&#xff0c;拿n4,k4作比较&#xff1a; 显然结果只可能是[1,2,3,4]&#xff0c;选取顺序只可能是1-2-3-4&#xff…

美港通正规股票交易市场人民币突然拉升,市场开启“大风车”模式?

查查配今天上午,市场又开启了“大风车”模式,多个热点轮番拉升。 一则关于地产行业利好的小作文流出,地产产业链上午爆发,租售同权、房地产服务、房地产开发等板块大涨,光大嘉宝、天地源等个股涨停。万科A涨超4%。 美港通证券以其专业的服务和较低的管理费用在市场中受到不少…

Word文件加密方法分享,为文档上锁很简单!

“我在使用电脑时&#xff0c;需要将一份Word文档加密&#xff0c;但是不知道应该怎么去操作&#xff0c;大家可以给我分享一些简单的文件加密方法吗&#xff1f;” 随着数字化办公的普及&#xff0c;Word文档的安全性越来越受到人们的关注。为了确保重要文档的机密性和安全性&…

【echart】实现echart图的富文本样式

贴源码 let xData [山西,山东,内蒙,甘肃];let averData [2, 3,1, 3];var eicon path://M480.55,252.18L318.88,498.04c-15.95,24.25,1.08,56.57,30.11,57.12l147,2.79L448.5,696.92c-14.74,43.15,39.88,75.83,70.93,42.44l216.73-233.04c21.93-23.58,5.21-61.98-27-61.98H56…

【prometheus】prometheus基于consul服务发现实现监控

目录 一、consul服务发现简介 1.1 consul简介 二、prometheus配置 2.1 node-exporter服务注册到consul 2.2 修改prometheus配置文件 【Prometheus】概念和工作原理介绍_prometheus工作原理-CSDN博客 【Prometheus】k8s集群部署node-exporter 【prometheus】k8s集群部署p…

DOS学习-目录与文件应用操作经典案例-cd

欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一.前言 二.案例 三.练习 一.前言 虽然Windows 2000/XP/2003系统已经不再使用纯DOS平台&#xff0c;但它们内建了一个功能强大的命令行界面。在这个界面中&#xff0c;用户可以像在Wind…

图算法-网络流的最大流问题

相关文章&#xff1a; 数据结构–图的概念 图搜索算法 - 深度优先搜索法&#xff08;DFS&#xff09; 图搜索算法 - 广度优先搜索法&#xff08;BFS&#xff09; 图搜索算法 - 拓扑排序 图搜索算法-最短路径算法-戴克斯特拉算法 图搜索算法-最短路径算法-贝尔曼-福特算法 图搜索…

Linux(八) 进程间通信

目录 一、什么进程间通信 1.1 进程间通信的目的 1.2 进程间通信的概念 1.3 进程间通信的分类 二、 管道/匿名管道(pipe) 2.1 什么是管道 2.2 管道的创建 2.3 站在文件描述符角度-深度理解管道 2.4 站在内核角度-管道本质 2.5 匿名管道的读写 2.6 匿名管道的读写规则 …

如何在VS Code中安装插件并进行中文化。

相关文章推荐: 如何下载和安装Visual Studio Code&#xff08;VSCode&#xff09; 在使用Visual Studio Code&#xff08;简称VS Code&#xff09;进行开发时&#xff0c;安装插件可以极大地提升开发效率和使用体验。而将VS Code插件界面进行中文化&#xff0c;则能更好地满足中…

图形程序复用新纪元 探讨云库安全分享计划

在公司的开放式办公室中&#xff0c;卧龙与凤雏相邻而坐。周围的同事们都在忙碌地工作&#xff0c;键盘敲击声不绝于耳。卧龙眉头紧锁&#xff0c;全神贯注地调试着复杂的代码&#xff0c;仿佛在挑战编程世界的极限。而凤雏则在完成了一段代码编写后&#xff0c;轻松地伸展着身…

华为OD机试 - 山峰个数(Java 2024 C卷 100分)

华为OD机试 2024C卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷C卷&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;每一题都有详细的答题思路、详细的代码注释、样例测试…