Android Kotlin知识汇总(一)编程语言

news2024/11/18 6:47:23

        在 2019 年 Google I/O 大会上宣布今后将优先采用 Kotlin 进行 Android 开发。Kotlin 是一种富有表现力且简洁的编程语言,不仅可以减少常见代码错误,还可以轻松集成到现有应用中。如果您想构建 Android 应用,建议您从 Kotlin 开始着手,充分利用一流的 Kotlin 功能。

为什么要优先使用 Kotlin 进行 Android 开发?

根据来自开发者、客户顾问委员会 (CAB)、Google Developers 专家 (GDE) 的反馈,以及我们通过开发者调研获得的反馈。许多开发者已喜欢上使用 Kotlin,且提供更多 Kotlin 支持的呼声很高。下面介绍了开发者喜欢用 Kotlin 编写代码的原因:

  • 富有表现力且简洁:您可以使用更少的代码实现更多的功能。表达自己的想法,少编写样板代码。在使用 Kotlin 的专业开发者中,有 67% 的人反映其工作效率有所提高。
  • 更安全的代码:Kotlin 有许多语言功能,可帮助您避免 null 指针异常等常见编程错误。包含 Kotlin 代码的 Android 应用发生崩溃的可能性降低了 20%。
  • 可互操作:您可以在 Kotlin 代码中调用 Java 代码,或者在 Java 代码中调用 Kotlin 代码。Kotlin 可完全与 Java 编程语言互操作,因此您可以根据需要在项目中添加任意数量的 Kotlin 代码。
  • 结构化并发:Kotlin 协程让异步代码像阻塞代码一样易于使用。协程可大幅简化后台任务管理,例如网络调用、本地数据访问等任务的管理。

学习 Kotlin 编程语言

        Kotlin 是一种静态类型的语言,类型将在编译时解析且从不改变。类、函数和变量在本质上默认是 final 的,即它们不能从任何其他类继承。 因此,为了使其可从其他类继承,我们使用带有类、函数和变量名的 open 关键字。

变量声明

Kotlin 使用两个不同的关键字(即 val 和 var)来声明变量。

  • val 用于值从不更改的变量。使用 val 声明的变量无法重新赋值。
  • var 用于值可以更改的变量。

Const 关键字

  • const只能修饰val,不能修饰var类型变量;
  • const 只在top-level级别和object中声明。
    const val constVariable = "const_variable"
    object obj{
        const val constVariable = "const_variable"
    }
    class ConstKotlin {
        companion object{
            const val constVariable = "const_variable"
        }
    }

    (1)val 修饰的属性相当于java中private final static修饰的常量;
    (2)const val 修饰的属性相当于java中的public final static修饰的常量;
    (3)出于性能考虑,使用const val方式可以避免频繁函数调用。

类型推断

Kotlin 编译器可根据所赋值的类型来推断其类型。利用 Kotlin 的类型推断,既能确保代码简洁,又能确保类型安全。

val languageName = "Kotlin"
val upperCaseName = languageName.toUpperCase()
// Fails to compile
languageName.inc()

示例,为 languageName 赋予初始值后,languageName 推断为 String,因此无法对其调用任何不属于 String 类的函数。

Null 安全

在其他语言中,声明的引用类型变量默认null值。Kotlin 变量不能持有 null 值。要使变量持有 null 值,它必须是可为 null 类型。可以在变量类型后面加上 ? 后缀,将变量指定为可为 null。

// Fails to compile
val languageName: String = null

val languageName: String? = null

条件语句

Kotlin 提供了几种实现条件逻辑的机制,其中最常见的是 if-else 语句。如果每个分支都是输出一个 String。为了避免这种重复,Kotlin 提供了条件表达式:

val answerString: String = if (count == 42) {
    "I have the answer."
} else if (count > 35) {
    "The answer is close."
} else {
    "The answer eludes me."
}
println(answerString)

注意:Kotlin 不包含传统的三元运算符。也可以使用 when 表达式,如以下示例所示:

val answerString = when {
    count == 42 -> "I have the answer."
    count > 35 -> "The answer is close."
    else -> "The answer eludes me."
}
println(answerString)

函数

要声明函数,请使用 fun 关键字,后跟函数名称。接下来,定义函数接受的输入类型,并声明它返回的输出类型。

fun generateAnswerString(countThreshold: Int): String {
    val answerString = if (count > countThreshold) {
        "I have the answer."
    } else {
        "The answer eludes me."
    }
    return answerString
}
调用此函数时,必须在函数调用的圆括号内添加一个参数:
val answerString = generateAnswerString(42)

简化函数:

fun generateAnswerString(countThreshold: Int): String = if (count > countThreshold) {
        "I have the answer"
    } else {
        "The answer eludes me"
    }

匿名函数:

val stringLengthFunc: (String) -> Int = { input ->
    input.length
}
调用传入String参数,返回Int类型
val stringLength: Int = stringLengthFunc("Android")

高阶函数:

一个函数可以将另一个函数当作参数。将其他函数用作参数的函数称为“高阶函数”。

fun stringMapper(str: String, mapper: (String) -> Int): Int {
    // Invoke function
    return mapper(str)
}

 Kotlin 中的所有函数在本质上默认也都是 final 。即方法不允许被重写。需要加open关键字。

类&属性

      使用 class 关键字来定义类。类使用属性来表示状态。属性是类级变量,可以包含 getter、setter 和后备字段。注意,默认类和属性都是final public修饰的。即不可继承和重写,需要加open关键字修饰才可以。

例如,汽车需要轮子来驱动,添加 Wheel 对象的列表作为 Car 的属性,如以下示例所示:

class Car {
    val wheels = listOf<Wheel>()
}
//或者
class Car(val wheels: List<Wheel>)

注意,wheels 默认是一个 public val,可以从 Car 类外部访问 wheels。

val car = Car() // construct a Car
val wheels = car.wheels // retrieve the wheels value from the Car

如果希望公开属性的 getter 而限制访问其 setter,则可以将该 setter 指定为 private

class Car(val wheels: List<Wheel>) {
    private val doorLock: DoorLock = ...
    var gallonsOfFuelInTank: Int = 15
        private set
    fun unlockDoor(key: Key): Boolean {
        // Return true if key is valid for door lock, false otherwise
    }
}

data 关键字

在kotlin中数据类通过data关键字来修饰。使用data修饰数据类的条件:

  • 数据类不能用abstract、open、sealed修饰,也不能定义成内部类;
  • 数据类可以实现接口也可以继承其他类;
  • 主构造器必须至少有一个用var/val声明的参数;
  • 如果想让JVM为数据类生成一个无参构造,参数必须都有默认值。示例代码如下:
data class Result(var code:Int=0,val msg:String=""){}

 sealed 关键字 

用于声明一个"密封类"(sealed class),是一种特殊的抽象类,用于限制继承它的子类,并且在处理密封类实例时提供编译时安全性和警告。示例如下:

sealed class Result {
    data class Success(val data: String) : Result()
    data class Error(val message: String) : Result()
}
fun handleResult(result: Result) {
    when (result) {
        is Result.Success -> {
            println("Success: ${result.data}")
        }
        is Result.Error -> {
            println("Error: ${result.message}")
        }
    }
}

上例中,密封类Result有两个子类:Success和Error。handleResult函数接受一个Result参数,并使用when表达式来处理不同的结果类型。

使用密封类时,编译器会提示我们是否已经覆盖了所有可能的情况。如果我们忘记处理某个子类,编译器会给出警告。这样可以帮助我们编写更可靠的代码。


互操作性

        Kotlin与 Java 之间流畅的互操作性。由于 Kotlin 代码可编译为 JVM 字节码,因此 Kotlin 代码可直接调用 Java 代码,反之亦然。这意味着,您可以直接从 Kotlin 利用现有的 Java 库。此外,绝大多数 Android API 都是用 Java 编写的,因此可以直接从 Kotlin 调用它们。

下一篇,继续介绍 Kotlin 语言在 Android 实战开发过程中最有用的一些方面。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ComfyUI中如何自动获取当前日期

之前也介绍过&#xff0c;生成的文件夹是可以直接获取当前的日期&#xff0c;作为文件名进行保存的。但是如果你想获得当前的日期&#xff0c;然后写入到图片上的话&#xff0c;这个需求可能比较小众&#xff0c;查了半天资料&#xff0c;找到一个节点刚好能适配这个需求&#…

软件设计师16--段页式存储

软件设计师16--段页式存储 考点1&#xff1a;页式存储存储管理 - 页式存储组织存储管理 - 页面置换算法例题&#xff1a; 考点2&#xff1a;段式存储存储管理 - 段式存储组织例题&#xff1a; 考点1&#xff1a;页式存储 存储管理 - 页式存储组织 页式存储&#xff1a;将程序…

一体机电脑辐射超标整改

电脑一体机是目前台式机和笔记本电脑之间的一个新型的市场产物&#xff0c;它将主机部分、显示器部分整合到一起的新形态电脑&#xff0c;该产品的创新在于内部元件的高度集成。随着无线技术的发展&#xff0c;电脑一体机的键盘、鼠标与显示器可实现无线链接&#xff0c;机器只…

阿里云最新优惠券领取入口及使用指南

随着云计算技术的普及与服务升级&#xff0c;阿里云作为全球领先的云服务提供商&#xff0c;不断推出各类优惠活动以降低企业和个人用户上云成本。本文将详细介绍阿里云最新优惠券的领取入口以及如何有效地使用优惠券。 一、阿里云优惠券领取入口 阿里云优惠券一般可以通过阿里…

Nodejs 第五十四章(net)

net模块是Node.js的核心模块之一&#xff0c;它提供了用于创建基于网络的应用程序的API。net模块主要用于创建TCP服务器和TCP客户端&#xff0c;以及处理网络通信。 TCP&#xff08;Transmission Control Protocol&#xff09;是一种面向连接的、可靠的传输协议&#xff0c;用于…

【DataWhale学习】用免费GPU线上跑chatGLM项目实践

用免费GPU线上跑chatGLM项目实践 ​ DataWhale组织了一个线上白嫖GPU跑chatGLM与SD的项目活动&#xff0c;我很感兴趣就参加啦。之前就对chatGLM有所耳闻&#xff0c;是去年清华联合发布的开源大语言模型&#xff0c;可以用来打造个人知识库什么的&#xff0c;一直没有尝试。而…

【开源】SpringBoot框架开发公司货物订单管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 客户管理模块2.2 商品维护模块2.3 供应商管理模块2.4 订单管理模块 三、系统展示四、核心代码4.1 查询供应商信息4.2 新增商品信息4.3 查询客户信息4.4 新增订单信息4.5 添加跟进子订单 五、免责说明 一、摘要 1.1 项目…

机械女生,双非本985硕,目前学了C 基础知识,转嵌入式还是java更好?

作为单片机项目开发的卖课佬&#xff0c;个人建议&#xff0c;先转嵌入式单片机开发方向&#xff0c;哈哈。 java我也学过&#xff0c;还学过oracle、mysql数据库&#xff0c;只是当时没做笔记&#xff0c;找不好充分的装逼证据了。 从实习通过业余时间&#xff0c;学到快正式毕…

牛客-DP38 【模板】二维差分

【模板】二维差分_牛客题霸_牛客网 (nowcoder.com) b站有视频&#xff1a;讲解前缀和和差分 二维差分_哔哩哔哩_bilibili 注意&#xff1a;差分的过程叫差分&#xff0c;而不仅仅是d[]这个数组&#xff0c;其他数组经行了差分的操作&#xff0c;就也是差分啊&#xff01;&…

力扣热题100_矩阵_73_矩阵置零

文章目录 题目链接解题思路解题代码 题目链接 73.矩阵置零 给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,1,1],[1,0,1],[1,1,1]] 输出&…

安卓上架华为踩坑合集

1.如果是离线打包&#xff0c;注意在manifest那里修改&#xff1a; android:debuggablefalse2…您的应用targetsdk版本低于30&#xff0c;不符合华为应用市场审核标准。 修改建议&#xff1a;请您将应用targetsdk等级升级到30或30以上。 因为之前我升到30被打回来过&#xff…

Live800:企业如何与客户建立长期、稳定关系,实现双赢

在当今的商业环境中&#xff0c;企业不仅需要吸引新客户&#xff0c;更需要与现有客户建立长期、稳定的关系。这样的关系可以带来持续的收入&#xff0c;提高企业的利润性。然而&#xff0c;如何建立和维护这样的关系呢&#xff1f;文章将从三个方面进行深入探讨&#xff1a;提…

C语言之文件操作(万字详解)

个人主页&#xff08;找往期文章包括但不限于本期文章中不懂的知识点&#xff09;&#xff1a; 我要学编程(ಥ_ಥ)-CSDN博客 目录 前言 文件的打开和关闭 流和标准流 文件指针 文件的打开和关闭 文件的顺序读写 顺序读写函数介绍 fputc的使用 fgetc的使用 fput…

【Python学习篇】Python基础入门学习——Python基础语法(二)

个人名片&#xff1a; &#x1f981;作者简介&#xff1a;学生 &#x1f42f;个人主页&#xff1a;妄北y &#x1f427;个人QQ&#xff1a;2061314755 &#x1f43b;个人邮箱&#xff1a;2061314755qq.com &#x1f989;个人WeChat&#xff1a;Vir2021GKBS &#x1f43c;本文由…

slowfast network

SlowFast Networks for Video Recognition_slowfast networks for video recognition 复现过程-CSDN博客https://blog.csdn.net/karen17/article/details/95936983?ops_request_misc%257B%2522request%255Fid%2522%253A%2522171041325416800184121120%2522%252C%2522scm%2522%…

【SSM】任务列表案例 基本CRUD SSM整合

文章目录 一、案例功能预览二、接口分析三、前端工程导入四、后端程序实现和测试4.1 准备4.2 功能实现4.2.1 分页查询显示4.2.2 添加计划4.2.2 删除计划4.2.3 修改计划 4.3 前后联调 一、案例功能预览 Github 地址 &#xff1a; ssm-integration-part 二、接口分析 学习计划…

电脑干货:6款免费的实用工具,值得收藏

目录 1、HelloWindows 2、Memory Helper 3、MindNode 4、B站视频下载工具 5、wallhaven壁纸 1、HelloWindows HelloWindows是一个纯净Windows系统下载网站&#xff0c;它可以下载到所有Windows系统源文件&#xff0c;比如Windows11、Windows10、win7、XP等&#xff0c;也可…

Liunx下安装Redis(详细安装)

1、创建一个文件目录 mkdir /opt/redis2、进入安装目录 cd /opt/redis3、下载redis默认安装包 默认是3.0版本的 wget http://download.redis.io/releases/redis4、进行解压 tar -xzvf redis-3.0.7.tar.gz5、进入解压好的文件夹目录 cd redis-3.0.7 6、将redis重新安装到 …

蓝桥杯-特殊日期

代码及思路详解 #include <iostream> using namespace std; int func(int n) {int sum0; while(n){sumn%10;n/10;//d得到每一位的数 }return sum; } int main() {int count0;int year,month,days[13]{0,31,28,31,30,31,30,31,31,30,31,30,31};for(year1900;year<999…

汽车行业一项网络安全标准实践指南发布,SSL证书助力传输通道加密,确保数据安全

2024年3月7日&#xff0c;全国网络安全标准化技术委员会秘书处发布了《网络安全标准实践指南——车外画面局部轮廓化处理效果验证》&#xff08;以下简称《实践指南》&#xff09;&#xff0c;旨在指导汽车数据处理者对车外画面进行人脸、车牌局部轮廓化处理效果的自行验证。《…