Kotlin
kotlin来源
Kotlin 来源于一个岛屿的名字,全称是 Kotlin Island,是英语「科特林岛」之意,这个小岛属于俄罗斯。
2010 年 :JetBrains 着手开发 Kotlin。
2011 年 7 月 :JetBrains 公开宣布 Kotlin。
2012 年 2 月 :JetBrains 在 Apache 2 许可证下开源了 Kotlin 的源码。目前 Kotlin 的官方源代码在 Github 上 https://github.com/JetBrains/kotlin 。
2016 年 2 月 :JetBrains 发布了 Kotlin 1.0 版,算是比较稳定的正式版。许诺之后一直会保持向后兼容。
2017 年目前最新版本 :1.1.2(2017 年 6 月)。相比 Kotlin 1.0 版本时,和 Kotlin 有关的代码数目从 210 万行飞升到 1000 多万行。
2017.05.08Google I/O大会宣布Kotlin作为Android官方开发语言,亲儿子。。
Kotlin和java一样是基于JVM的语言
kotlin与java7相比 优势到底是什么?
- 它更加易表现:这是它最重要的优点之一。你可以编写少得多的代码。
- 它更加安全:Kotlin是空安全的,也就是说在我们编译时期就处理了各种null的 情况,避免了执行时异常。如果一个对象可以是null,则我们需要明确地指定 它,然后在使用它之前检查它是否是null。你可以节约很多调试空指针异常的 时间,解决掉null引发的bug。
- 它是函数式的:Kotlin是基于面向对象的语言。但是就如其他很多现代的语言 那样,它使用了很多函数式编程的概念,比如,使用lambda表达式来更方便地 解决问题。其中一个很棒的特性就是Collections的处理方式。
- 它可以扩展函数:这意味着我们可以扩展类的更多的特性,甚至我们没有权限 去访问这个类中的代码。
- 它是高度互操作性的:你可以继续使用所有的你用Java写的代码和库,因为两 个语言之间的互操作性是完美的。甚至可以在一个项目中使用Kotlin和Java两 种语言混合编程。
- 它可以多平台开发:基于 JVM 的开发,Android 开发,Web 开发,Native(原生)开发。其中 Web 开发可以结合 spring 框架,而且 Kotlin 也可以编译生成 JavaSript 模块,可以在一些 JavaScript 的虚拟机上编译。Native 开发就更牛了,目前 Kotlin 官方在 Github 开源了 Native 开发的源码 https://github.com/JetBrains/kotlin-native,基于 LLVM(Low Level Virtual Machine 的缩写,表示「底层虚拟机」。LLVM 是一种编译器基础设施,以 C++ 写成。它是为了任意一种编程语言而写成的程序,利用虚拟技术创造出编译时期、链接时期、运行时期以及闲置时期的最优化)的后端,方便为各个平台编写原生应用,比如为 Mac OS,iOS,Linux,嵌入式系统,等等
参考资料:http://blog.csdn.net/weixin_37730482/article/details/73558216
基本类型
1.kotlin支持的基本类型:
Double Float Long Int Short Byte
<!--其中Byte不是数值类型, kotlin中每个类型都是一个对象, kotlin不支持8进制-->
数字类型不会自动转型,比如 不能给Long类型变量分配一个Int值,如果要赋值一个Int类型的必须要做明确的类型转换,每一种基础类型都有转型的方法:
val int :Int = 1
val long :Long =i.toLong()
在kotlin中定义变量时使用(kotlin中声明变量有两种方式,使用var声明的是可变变量,可以重新赋值,val声明的类似java中的final修饰的常量):
var c = 'c'//kotlin中可以通过值推断出变量的类型,所以我们的类型通常可以省略掉
var int = 12
var long =121L
val string = "hello,wordl"//不可变变量
数值类型的变量支持添加下划线:
val one_million = 1_000_000
val id_card=411_325_1988_0926_5036L
字符(char) 不能直接作为一个数字处理,在使用时可以转换为一个数字
val c :Char = 'c'
cal cToInt :Int = c.toInt()
2.数组:
数组 在kotlin中 数组由Array类表示,我们可以通过arr
ayOf(1,2,3)这种方式来创建数组:
var array: Array<Int> = arrayOf(1, 2, 3)
var arrayOfNulls: Array<Int?> = arrayOfNulls(5)//可以指定一个定长的空数组
var arrayOfIndex: Array<Int> = Array(5, { i -> (i * i) })//可以构建一个通过数组索引产生数组元素值的数组
3.String 字符串
kotlin中的字符串字面量分为两种
val s = "hello , world \n"
// 一种是""包裹的,这种字符串与java里的String 类似 可以识别转义字符
//另一种是不识别特殊字符,写什么就是什么的 字符串 所以这个注释不能跟到下面一行的后面- -
val text = """
for(c in "foo"){
print(c)
}
\r \n
"""//上面这个字符串可以用trimMargin来去除开头的空格
text.trimMargin()
字符串模版
println("text = $text1")//可以直接用$跟变量
println("text = ${text1.length}")//也可以直接用${}包裹表达式
一个String可以像数组那样被迭代访问:
val string = "Hello,World"
val c = string[2]//这是字符'l'
for(c in string){
println(c)
}
属性
Kotlin中的属性与java中的属性相同,不过属性自实现了getter和setter。如果没有任何制定,属性会默认使用getter和setter
class Person{
var name :String = ""
}
val person = Person()
person.name = "lisi"//Kotlin中默认已经实现了getter setter
val name = person.name
如果想要修改默认的getter 和 setter,可以这样做:
class Person{
var name :String = ""
get() = field.toUpperCase()
set(value) {
field = "Name:$value"
}
}
修改了getter和setter之后,就会再调用属性时按照修改后的调用getter和setter
当我们直接调用属性的时候不是直接访问类的属性,而是调用了getter 和setter方法。
Android中的耗时操作需要在子线程中运行,使用java时可以通过new Thread 或者Rxjava来进行异步处理。
在kotlin中,使用Anko库可以
async{
Request("url"
).run()//在子线程运行的
uiThread { toast("request success") }//uiThread是在主线程中运行的,uiThread可以依赖于调用者,如果它是被一个Activity调用的,
//如果activity.isFinishing()返回true,uiThread就不会被执行了。这样就不会在Activity销毁时崩溃了。
}
修饰符
可见性修饰符
Kotlin中的可见性修饰符与java中有一些不同,
kotlin修饰符有五种 :
public private protected default//和java一样的四种
internal// kotlin多出了一种模块module级别的internal,一个module中不能跨module访问方法和变量
在Kotlin中默认的可见性修饰符是public
Kotlin中的null安全
在java中 类似 String nullStr = null; nullStr.length() ;
该代码可以被编译,但是在运行时会抛出NullPointerException,这样相当不安全
指定一个变量是可null是通过在类型的最后增加一个问号,因为在kotlin中一切都是对象,一切都是可null的。
val a : String? = null
一个可null类型,在没有进行检查之前你是不能直接使用它的()。还有一个特性是当我们检查了一个对象的可null性,之后这个对象就会自动转型成不可null类型。这就是kotlin编译器的智能转换。
(Kotlin for android developer 140)
如果我们不需要是用null引用,可以使用安全访问操作符(?),使用之后只有引用不为null才会执行代码,否则不做任何操作。
我们可以使用Elivs Operator(?:),类似三元表达式
val length = a?.length?:-1
//如果不为null,返回a.length,如果为null返回-1
有一种情况是,我们明确的知道我们使用的是不null变量,但是他的类型却是可null的。我们可以直接是用!!操作符强制编译器执行可null类型时跳过限制检查。
val a :String? = null;
a!!.length//这里明显会崩溃,所以我们使用!!来强制执行的时候,要确保对象非null。
<!--KotlinNullPointerException-->