IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Kotlin:数据类、密封类,kotlin协程原理 -> 正文阅读

[移动开发]Kotlin:数据类、密封类,kotlin协程原理

  • 数据类是可以实现接口的,如(序列化接口),同时也是可以继承其他类的,如继承自一个密封类。

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?+?'\''?+  
????????????????'}';  
????}  
}  

分析:实现同一个功能,从代码量来说,KoltinJava少了很多行代码,比起更简洁。

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学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》收录,自学资源及系列文章持续更新中…

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-09-11 18:56:29  更:2021-09-11 18:58:17 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 16:36:01-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码