Kotlin学习(一)基础

2017-07-13  本文已影响34人  null_null

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相比 优势到底是什么?

参考资料: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-->
上一篇 下一篇

猜你喜欢

热点阅读