Kotlin
简介
Kotlin [1] (科特林)是一个用于现代多平台应用的静态编程语言 [2] ,由 JetBrains 开发。 Kotlin可以编译成Java字节码,也可以编译成JavaScript,方便在没有JVM的设备上运行。除此之外Kotlin还可以编译成二进制代码直接运行在机器上(例如嵌入式设备或 iOS) Kotlin已正式成为Android官方支持开发语言。
关键时间节点
2011年7月,JetBrains推出Kotlin项目,这是一个面向JVM的新语言 2012年2月,JetBrains以Apache 2许可证开源此项目。 2016年2月15日 Kotlin v1.0发布。 2017在Google I/O 中,Google宣布在Android上为Kotlin提供一等支持
设计目标
创建一种兼容Java的语言 让它比Java更安全,能够静态检测常见的陷阱。如:引用空指针 比java更简洁
如何使用kotlin开发Android应用
1.学习kotlin基本语法,变量声明,循环,条件语句 结合使用这里强调下 kotlin基础与java基础语法还有有些区别的 常见的区别如下:
-包 比如说 程序员A写了一个类叫JSON,程序员B也写了一个类叫JSON,然后我们写代码的时候想要同时使用这两个类,该怎么区分呢?一个答案是使用目录命名空间。对应在java中就是使用包(package)来组织类,以确保类名的唯一性。上面说的例子,A写的类放到package com.abc.fastjson中 ,B写的类就放到package com.bbc.jackjson中。这样我们在代码中,就可以根据命名空间来分别使用这两个类。调用如下: com.abc.fastjson.JSON.toJSONString(); com.bbc.jackjson.JSON.parseJSONObject(); kotlin也沿袭了Java的package概念,同时做了些扩展 我们可以在*.kt文件开头声明package命名空间。例如在PackageDemo.kt源代码中,我们按照如下方式声明包:包的声明处于源文件顶部。这里,我们声明了包com.easy.kotlin,里面定义了包级函数what(),同时定义了一个类Motorbike。另外,目录与包的结构 无需匹配:源代码可以在文件系统的任意位置。
-声明变量和值 首先,在Kotlin中,一切都是对象,所以,所有变量也都是对象(也就是说,任何变量都是根据引用类型来使用的)。 Kotlin的变量分为var(可变的) 和 val(不可变的)。可以简单的理解为: var是可写的,在它生命周期中可以被多次赋值 val是只读的,仅能一次赋值,后面就不能被重新赋值
-变量类型推断
-
省去变量类型 在Kotlin中,大部分情况下不需要说明你使用对象的类型,编译器可以直接推断出它的类型代码如下:所以,我们只需要依据要产生的变量类型填写var或val,其类型通常能够被推断出来,编译器能够检测其类型,自动完成类型转换。当然,我们也可以明确地指定变量类型。但是类型推断不是所有的。例如,整形变量Int不能赋值Long变量。下面的代码不能通过编译 -
使用is 运算符进行类型检测 is运算符检测一个表达式是否为某类型的一个实例。如果一个不可变的局部变量或属性已经判断为某类型,那么检测厚的分支中可以直接当作该类型使用,无需显式转换:
-字符串与其模板表达式 原始字符串(raw string)由三重引号(""")分隔(这个跟python一样)。原始字符串可以包含换行符和任何其他字符字符串可以包含模板表达式。模板表达式以美元符号($)开始: -流程控制语句 ,流程控制语句是编程中的核心之一,一般可以分为如下三类
-
分支语句(if,when) if-else语句是控制程序流程的最基本形式,其中 else可选。在Kotlin中,if是一个表达式,即它会返回一个值另外,if的分支可以是代码快,最后的表达式作为该块的值: ifif作为代码块时,最后一行为其返回值,另外,在Kotlin中没有类似true?1:0这样的三元表达式,对应的写法是使用 if else 语句 if-else语句规则: if后的括号不能省略,括号里的表达式的值必须是布尔型。如果条件体内只有一条语句需要执行,那么if后面的大括号可以省略。良好的编程风格建议加上大括号。对于给定的if,else语句是可选的,else if语句也是可选的。else 和 else if 同时出现时,else 必须出现在 else if之后。如果有多条else if语句同时出现,那么如果有一条else if语句的表达式测试成功,那么会忽略掉其他所有else if和else的分支。如果出现多个if ,只有一个else 的情形,else子句归属于最内层的if语句。这些规则跟Java ,C语言基本相同。 when when表达式类似于 switch-case表达式。 when会对所有的分支进行检查,直到有一个条件满足为止。但相比switch-case而言,when的语句更加强大,灵活。Kotlin的极简语法表达风格,使得我们对分支检查的代码写起来更加简单直接:像if一样,when的每一个分支也可以是一个代码块,它的值是块中最后的表达式的值。如果其他分支都不满足条件,则会到else分支(类似default)。如果我们有很多分支需要用相同的方式处理,则可以把多个条件分支条件放在一起,用逗号分隔:可以用任意表达式(而不只是常量)作为分支条件也可以检测一个值在(in)或者不在(!in)一个区间或者集合中: -
循环语句(for,while)Kotlin的for循环与现代的程序设计语言基本相同,这里就不做过多介绍了 -
跳转语句(break,continue,return,throw) while,do…while,break,continue使用方式与C,Java语言基本一致,这里就不做过多介绍了。return的介绍:在Kotlin中,除了表达式的值,返回值的函数都要求显示地使用return来返回其值在Kotlin中,可以直接使用=符号来直接返回一个函数的值:这里要留意=符号后面的表达式 带上{}后意义会不同 如果带上{} 返回的是函数类型。 Kotlin中return语句 会从最近的函数或匿名函数中返回,但是在Lambda表达式中遇到return ,则直接返回最近的外层函数,例如如下面两个函数是不同的:在returnDemo_2中,我们用一个匿名函数替代lambda表达式。匿名函数内部的return语句将从该匿名函数自身返回。在Kotlin中这是匿名函数和lambda表达式行为不一致的地方。
当然为了显示地指明return返回的地址,为此Kotlin还提供了@Label(标签)来控制返回语句。在Kotlin中任何表达式都可以用标签(label)来标记。标签的格式为标识符后跟@符合,例如abc@,jarOfLove@都是有效的标签。我们可以用Label标签来控制return ,break 或continue的跳转(jump)行为。 Kotlin的函数是可以被嵌套的。它有函数字面量,局部函数等。有了标签限制的return,我们就可以从外层函数返回了。例如,从lambda表达式中返回,returnDemo_2()我们可以显示地制定lambda表达式中的return地址是其入口处:我们在lambda表达式开头处添加了标签here@,可以这么理解:该标签相当于是记录了lambda表达式的指令执行入口地址,然后在表达式内部使用return@here跳转至lambda表达式该地址处。另外,也可以使用隐式标签更方便,该标签与接收该lambda的函数同名: throw表达式 在Kotlin中throw是表达式,它的类型是特殊类型:Nothing,该类型没有值。与C,Java中的void意思一样:我们在代码中,用Nothing来标记无返回的函数:另外,如果把一个throw表达式的值赋值给一个变量,需要显示声明类型为Nothing:另外,因为ex变量是Nothing类型,没有任何值,所以无法当作参数传给函数
-代码注释:正如Java和JavaScript ,Kotlin支持行注释及块注释 //这是一个行注释 /× 这是一个多行的 块注释 ×/ 与Java不同的是,Kotlin的块注释可以嵌套: -语法与标识符 我们知道,任何一门语言都会有一些自己专用的关键字,符号以及规定的语法规则等等。程序员们使用这些基础词汇和语法规则来表达算法步骤,也就是写代码的过程。 词法分析是编译器对源码进行编译的基础步骤之一。词发分析是将源程序读入的字符序列,按照一定的规则转换成词法单元(Token)序列的过程。词法单元是语言中具有独立意义的最小单元,包括修饰符,关键字,常数,操作符,等等
-
修饰符 在kotlin源码项目中 kotlin/grammar/src/modifiers.grm文件中,描述了Kotlin语言的修饰符:modifiers:(modifier | annotations) * ; typeModifiers:(suspendModifier | annotations)*; modifier : classModifier :accessModifier :varianceAnnotation :memberModifier :parameterModifier :typeParameterModifier :functionModifier :propertyModifier classModifier 类修饰符 : "abstract"抽象类 : “final” 不可被继承final类 : "enum"枚举类 : "open"可继承open类 : "annotation"注解类 : "sealed"密封类 : "data"数据类 memberModifier : "override"重写函数 : "open"可被重写 : "final"不可被重写 : "abstract"抽象函数 : "lateinit"后期初始化 accessModifier 访问控制权限 默认public : “private” : “protected” : “public” : “internal” 其中,internel访问权限,指的是整个模块内可访问。模块(module)是指一起编译的一组Kotlin源码代码文件:例如,InteliJ IDEA模块,Maven项目 或者Gradle项目,通过Ant任务的一次调用编译的一组文件等。 -
关键字 每一门语言都有自己的关键字集合,在Kotlin中,这些关键字定义如下: this 关键字的使用场景 1.在类的成员中,this指向的是该类的当前对象 2.在扩展函数或者带接收者的函数字面值中,this表示在点左侧传递的接收者参数 3.如果this没有限定符,它指的是最内层的包含它的作用域。 super关键字 持有指向其父类的引用 -
操作符 这里重点介绍Elvis操作符? 在Kotlin中 Elvis操作符特定是跟null比较,主要用来做null安全性检查 也就是说 y =x?:0 等价于 val y = if(x !== null) x else 0 Elvis 操作符? 是一个二元运算符,如果第一个操作数为真,则返回第一个操作数,否则将计算并返回其第二个操作数。它是三元条件运算符的变体。 -
扩展函数和扩展属性 Kotlin支持扩展函数和扩展属性。能够扩展一个类的新功能而无需继承该类或使用像装饰者这样的设计模式等 -
空指针安全 Java最大的一个问题是 null。 这个问题Kotlin针对Java做了改进。它使用了显式的null,这会强制我们在必要时进行null检查。Kotlin通过类型系统中的可空类型来实现空指针的安全检查。 -
标准库API简介 具体参考:http://kotlinlang.org/api/latest/jvm/stdlib/index.html 2.学习了基本语法后,基于AndroidStudio 创建kotlin demo 将java语法能够实现的,通过kotlin来一遍 如果有不会的,可以先用java写好,然后通过AndroidStudio直接将java文件编译为kotlin 照着参考即可。
|