- 数据类是可以实现接口的,如(序列化接口),同时也是可以继承其他类的,如继承自一个密封类。
1.3、用实例说明简洁性
1.3.1、数据类的对比
Kotlin版:
data?class?User(var?name?:?String,?var?pwd?:?String)
Java版:
public?class?User {
????private?String?name;
????private?String?pwd;
????public?User(){}
????public?User(String?name,?String?pwd) {
????????this.name?=?name;
????????this.pwd?=?pwd;
????}
????public?String?getName() {
????????return?name;
????}
????public?void?setName(String?name) {
????????this.name?=?name;
????}
????public?String?getPwd() {
????????return?pwd;
????}
????public?void?setPwd(String?pwd) {
????????this.pwd?=?pwd;
????}
????@Override
????public?String?toString() {
????????return?"User{"?+
????????????????"name='"?+?name?+?'\''?+
????????????????",?pwd='"?+?pwd?+?'\''?+
????????????????'}';
????}
}
分析:实现同一个功能,从代码量来说,Koltin 比Java 少了很多行代码,比起更简洁。
1.3.2、修改数据类属性
例:修改User 类的name 属性
Kotlin版:
Koltin 要修改数据类的属性,若属性使用val 修饰,则只能使用其独有的copy() 函数。其作用就是:修改部分属性,但是保持其他不变,若用var 修饰,也可以用Setter() 函数修改,这一点和Java 一样
val?mUser?=?User("kotlin","123456")
println(mUser)
mUser.name?=?"first?new?kotlin"
println(mUser)
val?mNewUser?=?mUser.copy(name?=?"second?new?Kotlin")
println(mNewUser)
输出结果为:
User(name=kotlin,?pwd=123456)
User(name=first?new?kotlin,?pwd=123456)
User(name=second?new?Kotlin,?pwd=123456)
Java版:
User?mUser?=?new?User("Java","123456");
System.out.println(mUser);
mUser.setName("new?Java");
System.out.println(mUser);
输出结果为:
User{name='Java',?pwd='123456'}
User{name='new?Java',?pwd='123456'}
1.4、解构声明
- 在前面讲到,
Kotlin 中定义一个数据类,则系统会默认自动根据参数的个数生成component1() … componentN() 函数。其…,componentN() 函数就是用于解构声明的
val?mUser?=?User("kotlin","123456")
val?(name,pwd)?=?mUser
println("name?=?$name\tpwd?=?$pwd")
输出结果为:
name?=?kotlin????pwd?=?123456
1.5、系统标准库中的标准数据类
- 标准库提供了 Pair 和 Triple。尽管在很多情况下命名数据类是更好的设计选择, 因为它们通过为属性提供有意义的名称使代码更具可读性。
- 其实这两个类的源码部分不多,故而贴出这个类的源代码来分析分析
1.5.1、源码分析
@file:kotlin.jvm.JvmName("TuplesKt")
package?kotlin
//?这里去掉了源码中的注释
public?data?class?Pair<out?A,?out?B>(
????????public?val?first:?A,
????????public?val?second:?B)?:?Serializable?{
????//?toString()方法
????public?override?fun?toString():?String?=?"($first,?$second)"
}
//?转换
public?infix?fun?<A,?B>?A.to(that:?B):?Pair<A,?B>?=?Pair(this,?that)
//?转换成List集合
public?fun?<T>?Pair<T,?T>.toList():?List<T>?=?listOf(first,?second)
//?这里去掉了源码中的注释
public?data?class?Triple<out?A,?out?B,?out?C>(
????????public?val?first:?A,
????????public?val?second:?B,
????????public?val?third:?C?)?:?Serializable?{
????//?toString()方法
????public?override?fun?toString():?String?=?"($first,?$second,?$third)"
}
//?转换成List集合
public?fun?<T>?Triple<T,?T,?T>.toList():?List<T>?=?listOf(first,?second,?third)
分析:从上面的源码可以看出,标准库中提供了两个标准的数据类,Pair类 以及Triple类 .其中:
- 两个类中都实现了
toList() 方法以及toString() 方法。 to() 方法乃Pair类 特有,作用是参数转换Pair类 需要传递两个参数,Triple类 需要传递三个参数。
1.5.2、用法
val?pair?=?Pair(1,2)????????//?实例
val?triple?=?Triple(1,2,3)??//?实例
println("$pair?\t?$triple")?//?打印:即调用了各自的toString()方法
println(pair.toList())??????//?转换成List集合
println(triple.toList())????//?转换成List集合
println(pair.to(3))?????????//?Pair类特有:?其作用是把参数Pair类中的第二个参数替换
输出结果为:
(1,?2)??????(1,?2,?3)
[1,?2]
[1,?2,?3]
((1,?2),?3)
二、密封类
密封类是用来表示受限的类继承结构
2.1、什么是受限的类继承结构
- 所谓受限的类继承结构,即当类中的一个值只能是有限的几种类型,而不能是其他的任何类型。
- 这种受限的类继承结构从某种意义上讲,它相当于是枚举类的扩展。但是,我们知道
Kotlin 的枚举类中的枚举常量是受限的,因为每一个枚举常量只能存在一个实例。 - 但是其和枚举类不同的地方在于,密封类的一个子类可以有可包含状态的多个实例。
- 也可以说成,密封类是包含了一组受限的类集合,因为里面的类都是继承自这个密封类的。但是其和其他继承类(
open )的区别在,密封类可以不被此文件外被继承,有效保护代码。但是,其密封类的子类的扩展是是可以在程序中任何位置的,即可以不在同一文件下。
2.2、关键字
定义密封类的关键字:sealed
声明格式
sealed?class?SealedExpr()
PS:密封类是不能被实例化的
即
val?mSealedExpr?=?SealedExpr()??//?这段代码是错误的,编译器直接会报错不能编译通过。
既然密封类 是不能实例化,那么我们要怎么使用,或者说它的作用是什么呢?
2.3、作用及用法
面试复习笔记
这份资料我从春招开始,就会将各博客、论坛。网站上等优质的Android开发中高级面试题收集起来,然后全网寻找最优的解答方案。每一道面试题都是百分百的大厂面经真题+最优解答。包知识脉络 + 诸多细节。 节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。 **[CodeChina开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》](
)**
《960页Android开发笔记》
《1307页Android开发面试宝典》
包含了腾讯、百度、小米、阿里、乐视、美团、58、猎豹、360、新浪、搜狐等一线互联网公司面试被问到的题目。熟悉本文中列出的知识点会大大增加通过前两轮技术面试的几率。
《507页Android开发相关源码解析》
只要是程序员,不管是Java还是Android,如果不去阅读源码,只看API文档,那就只是停留于皮毛,这对我们知识体系的建立和完备以及实战技术的提升都是不利的。
真正最能锻炼能力的便是直接去阅读源码,不仅限于阅读各大系统源码,还包括各种优秀的开源库。
本文已被腾讯CODING开源托管项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》收录,自学资源及系列文章持续更新中… 建立和完备以及实战技术的提升都是不利的。
真正最能锻炼能力的便是直接去阅读源码,不仅限于阅读各大系统源码,还包括各种优秀的开源库。
[外链图片转存中…(img-1vc28LuV-1631259171831)]
本文已被腾讯CODING开源托管项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》收录,自学资源及系列文章持续更新中…
|