Kotlin学习(一)基础

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-->
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,390评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,821评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,632评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,170评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,033评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,098评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,511评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,204评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,479评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,572评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,341评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,893评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,171评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,486评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,676评论 2 335

推荐阅读更多精彩内容