美文网首页
Kotlin学习(一)基础

Kotlin学习(一)基础

作者: null_null | 来源:发表于2017-07-13 17:20 被阅读34次

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-->

相关文章

网友评论

      本文标题:Kotlin学习(一)基础

      本文链接:https://www.haomeiwen.com/subject/imfghxtx.html