美文网首页
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