Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Kotlin简单问

Kotlin简单问

作者头像
码上积木
发布于 2020-12-25 02:03:01
发布于 2020-12-25 02:03:01
93900
代码可运行
举报
文章被收录于专栏:码上积木码上积木
运行总次数:0
代码可运行
前言

今天复习下kotlin相关的知识点和常考考点,通过这些问答相信你也能更一步了解Kotlin

kotlin为什么被设计出来

kotlin被设计出来并被Google推广,主要有以下优势:

  • 完全兼容Java
  • 更少的空指针异常
  • 更少的代码量,更快的开发速度(lambda表达式,扩展函数)

kotlin工作原理

首先,我们了解下Java的工作原理:

Java 代码是经过编译才能运行的。首先会编译成class文件,然后通过java虚拟机运行,在Android中也就是ART。

所以,任何语言只要能被编译成符合规格的class文件,就能被java虚拟机运行,也就能运行在我们的Android手机上,kotlin亦是如此。

  • 另外Android studio也提供了一个功能,可以查看kotlin对应的字节码:

Tools -> Kotlin -> Show Kotlin Bytecode

再点击Decomplie还可以反编译成Java文件。

kotlin的空安全

  • java中,我们可以任意初始化一个变量,而不需要赋值,比如String,就有它的默认值null。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
String a;

如果要调用对象的参数,必须判空:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if (a!=null){
   Log.d("lz","length="+a.length());
}else{
   Log.d("lz","length=null");
}
  • kotlin中,为了保证减少空指针的问题,不允许直接设置为空,可以通过?=的方式设置可以为空。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
val a: String ? = null

1)赋值的时候,可以直接使用?来表示这个对象可能为空,如果为空则表达式结果也为空,而不用进行非空判断。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//如果 b 非空,就返回 b.length,否则返回 null
val length = b?.length
//如果 b 非空,就返回 String类型的b,否则返回 null
val str = b as? String 

也就是通过问号来表示对象为空则整个表达式结果为空,而不会报错空指针。

2)如果需要设定为空的时候返回的表达式值不为空,可以用操作符?:来表示,也叫Elvis操作符。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//b为空则表达式返回-1
val length = b?.length ?: -1

3)如果要将值转换为非空类型,就可以使用 !!来标识非空,但是这种操作符就有可能会抛出空指针异常,如果实际对象为空的话。所以这种操作符相当于去除了空判断。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//如果b为空,空指针异常
val length = b!!.length

val和var

val,全称value,声明一个不可变的变量,这种变量在初始赋值之后就再也不能重新赋值了,所以相当于java中的final变量。

var,全称variable(可变的),所以是用来声明一个可变的变量,可以重复赋值。

kotlin中这么设计的原因主要是把不可变变量 这种因素和可变变量拿到同一级来设计,也就是说我们以后编码设计变量的时候,必须要考虑这个变量是不可变还是可变的,保护变量安全,养成良好习惯,而不像以前要在java中需要添加final这种稍微繁琐的举动。

扩展函数(Extension Function)

扩展函数,其实就是扩展类的函数,可以在已有的类中添加新的方法,比继承更加简洁优雅方便。

  • 扩展函数比如:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

fun Activity.showToast( msgId:Int){
    Toast.makeText(this,msgId,Toast.LENGTH_SHORT).show()
}

这样任何的Activity里面就可以直接调用showToast方法来展示Toast了。

  • 同样,可以设置扩展属性,比如:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var <T> MutableList<T>.lastData: T
    //获取List中最后一个对象
    get() = this[this.size - 1]
    //设置List中最后一个对象的值
    set(value) {
        this[this.size - 1] = value
    }

用法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var strs = mutableListOf<String>()
strs.lastData="heihei"
Log.e(TAG,"lastdata= ${strs.lastData}")

这里还涉及到两个知识点:

  • kotlin中,在使用对象的get和set方法,可以直接省略,直接使用属性名即可,会根据表达式的实际功能来添加对应的set或者get方法。
  • kotlin中,对于$符号表示 串模板,就是可计算的代码片段,可以将其计算结果链接到字符串中。

扩展属性原理

kotlin这个扩展功能确实设计的很巧妙,那就一起来研究下它的原理:

按照上面的方法,也就是Tools -> Kotlin -> Show Kotlin Bytecode -> Decomplie, 我们得到showToast扩展函数和使用代码所对应的java代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

//扩展函数
public final class UtilsKt {
   public static final void showToast(@NotNull Activity $this$showToast, int msgId) {
      Intrinsics.checkParameterIsNotNull($this$showToast, "$this$showToast");
      Toast.makeText((Context)$this$showToast, msgId, 0).show();
   }
}

//使用
UtilsKt.showToast(this, 1900026);

可以看到所谓的扩展函数不过就是自动生成一个带有当前对象的函数,扩展函数的所在类被public final修饰,函数被public static final修饰,然后扩展的那个类被作为方法的一个参数传进去,这样就跟我们用java的时候写的工具类很像。

然后使用的时候就跟我们使用工具类一样调用工具类的方法即可。

拜拜

今天就聊这么多了,kotlin东西还是挺多的,也有一些考点,下次继续聊。

?又到周一了,难受呀,祝大家这周工作顺利~

感谢大家的阅读,有一起学习的小伙伴可以关注下公众号—码上积木❤️ 每日三问知识点/面试题,积少成多。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-12-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码上积木 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
《Kotlin 程序设计》第四章 Kotlin 语法基础
Kotlin 可以省略变量定义的类型声明,但是在定义参数列表和定义返回值类型时则必须明确指定类型(这个类型推断Kotlin居然没做,这地方用起来比Scala,Groovy要繁琐点)。
一个会写诗的程序员
2018/08/17
1.5K0
kotlin到底好在哪里?
最近在学kotlin,虽然还没有像其他博主一样立马就爱上它.但是不得不说,kotlin对比起java还是有不少优势的. 1、语法简洁 首先是语法比较简洁,能不简单处理的就不啰嗦. 1.1、变量与常量 变量通过var关键字定义,常量通过val关键字定义.既支持类型推倒也支持显示声明类型.这样的话定义变量和常量写起来会比java简洁一些: var intVar = 1 var stringVar: String = "abc" val INT_VALUE = 1 1.2、类 在kotlin中,类可以通过cl
用户1269200
2018/03/20
1.1K0
遇见 Kotlin 先导篇:Kotlin 相比 Java 好在哪里?
本文主要介绍了Kotlin编程语言的一些主要优点,包括代码简洁易读、跨平台、强大的标准库、更少的代码完成、支持多种编程范式、良好的性能表现、现代化的IDE支持、以及逐渐增长的生态系统。同时,也探讨了Kotlin和Java的异同点,以及如何在实际项目中选择使用Kotlin或Java。
YingJoy_
2017/06/07
2.6K0
遇见 Kotlin 先导篇:Kotlin 相比 Java 好在哪里?
Kotlin 基础语法
以上例中 test() 的全名是 com.runoob.main.test、Runoob 的全名是 com.runoob.main.Runoob。
zhangjiqun
2024/12/16
1720
深入学习 Kotlin:基础语法与高级特性
🍆在学习之前,推荐大家看一篇AI相关的文章,AI生成模型赋能2024:跨行业变革与个人思考
Marblog
2024/11/13
2361
深入学习 Kotlin:基础语法与高级特性
Kotlin基本语法和使用技巧
take是从集合中取前几个元素 takeLast是从集合中取后几个元素 sortedBy 排序 过滤list,符合过滤条件的就是过滤结果 filterNot把符合条件的过滤掉,剩下的是结果。这个操作和 filter 相反 slice,取集合中的某一部分
六月的雨
2020/03/27
9160
Kotlin入门教程,快使用Kotlin吧
数组用Array类实现,和Java不同的地方在于,Array类有一个size属性表示数组长度,还有get和set方法,但是也可以使用array[position]的方式获取
用户2802329
2018/08/07
1.1K0
Kotlin入门教程,快使用Kotlin吧
Kotlin安卓开发学习(3)
在Java中,数据类占据着重要的角色,其通常需要重写包括equals(),hashCode(),toString()几个方法。
摸鱼的G
2023/02/22
6040
Kotlin 轻量级Android开发
它由Jetbrains创建,而Jetbrains则是诸多强大的工具(如知名的Java IDE IntelliJ IDEA)背后的公司。Kotlin是一门非常简单的语言,其主要目标之一就是提供强大语言的同时又保持简单且精简的语法。
Yif
2019/12/26
9940
Kotlin —— 这次入门就不用放弃了
声明:本文是FEELS_CHAOTIC原创,已获其授权发布,未经原作者允许请勿转载
用户2802329
2018/08/07
1.8K0
Kotlin —— 这次入门就不用放弃了
给 Java 开发者的 Kotlin 快速上手教程(Kotlin for Java Developers)v0.1
1995年,当年如日中天的Sun公司发布了Java语言,引起了巨大的轰动,与当时主流的C语言和Basic语言比起来,Java语言简单、面向对象、稳定、与平台无关、解释型、多线程、动态等特点,就像是打开了一个新的世界,一时间风靡全球,云集者众,微软为了模仿Java搞出C#语言,Netscape为了赶时髦硬塞出一个JavaScript语言,IBM则捏着鼻子做了Java IDE Eclipse(日蚀,呵呵)。直到现在,Java在编程世界里还占据着举足轻重的地位,Andy Rubin在开发Android系统时,也很自然地采用了Java和C++(C++负责NDK开发)作为开发语言。
一个会写诗的程序员
2018/12/07
1.2K0
给 Java 开发者的 Kotlin 快速上手教程(Kotlin for Java Developers)v0.1
From Java To Kotlin:空安全、扩展、函数、Lambda很详细,这次终于懂了
Kotlin 出自于捷克一家软件研发公司 JetBrains ,这家公司开发出很多优秀的 IDE,如 IntelliJ IDEA、DataGrip 等都是它的杰作,包括 Google 官方的 Android IDE -- Android Studio ,也是 IntelliJ IDEA 的插件版。
Seachal
2023/05/20
1.4K0
From Java To Kotlin:空安全、扩展、函数、Lambda很详细,这次终于懂了
Kotlin 基础 | 拒绝语法噪音
程序员最头痛的事莫过于看不懂别人的代码。缘由是各式各样的,但归结于一点就是复杂度太高。Kotlin 在降低代码复杂度上下了大功夫,运用一系列新的语法特性降低语法噪音,以求更简单直白地表达语义。
Rouse
2021/07/08
1.2K0
Kotlin 基础 | 拒绝语法噪音
【翻译】Kotlin致简代码之路
2017-06-30 by Liuqingwen | Tags: Kotlin 翻译 | Hits
IT自学不成才
2019/01/07
1.5K0
干货 | Kotlin超棒的语言特性
作者简介 何伦,携程度假BU移动端资深研发经理,负责iOS、Android平台上跟团游产品预订流程的前端页面的研发工作。对新技术有着浓厚的兴趣。 自从2017年Google宣布Kotlin成为Android官方开发语言之后,Kotlin受到广大Android开发者的追捧。其强大的安全性,简洁性和与Java的互操作性,为开发者带来了耳目一新的开发体验,也极大提升了Android原生代码的开发效率。 不过大部分开发者对Kotlin的使用,仍然局限于把Java代码逻辑按照Kotlin语法进行转换的层面,其实Ko
携程技术
2018/07/05
1.5K0
Kotlin入门(8)空值的判断与处理
上一篇文章介绍了如何对循环语句进行操作,末尾还演示了发现空串时直接继续下一循环,只是在初始化字符串数组时使用了“val poem2Array:Array<String?> = ***”,该表达式不免令
aqi00
2019/01/18
4.5K0
开心档-Kotlin 基础语法
以上例中 test() 的全名是 com.kxdang.main.test、Runoob 的全名是 com.kxdang.main.Runoob。
爱学iOS的小麦子
2023/02/08
7260
Kotlin 机制你都了解吗?
kotlin 是静态类型的编程语言,运行于 jvm 之上。如果在编译时知道变量的类型,则语言是静态类型的,在运行时知道变量类型,则语言是动态类型。
网罗开发
2021/04/07
8520
Kotlin 机制你都了解吗?
【Kotlin】Kotlin 基础语法指南
在 Kotlin 中,变量使用 var 声明,而常量则使用 val 声明。val 表示的变量在初始化后不能再修改,而 var 则可以在之后重新赋值。
人不走空
2024/07/13
1900
Kotlin学习笔记
在 Java 中有 switch 语句,在 Kotlin 中使用 when 来代替 switch
用户9854323
2022/06/25
2K0
Kotlin学习笔记
相关推荐
《Kotlin 程序设计》第四章 Kotlin 语法基础
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验