kotlin入门教程(幼儿园的门)

幼儿园入门

嘀嘀嘀校车来咯--kotlin是啥?了解一哈!

Kotlin 是一种在 Java 虚拟机上运行的静态类型编程语言,被称之为 Android 世界的Swift,Kotlin 可以编译成Java字节码,也可以编译成 JavaScript,方便在没有 JVM 的设备上运行。在Google I/O 2017中,Google 宣布 Kotlin 成为 Android 官方开发语言(那啥此处划重点--重点了解)。
我觉得这句划重点的话是我们选择kotlin的关键,当然除了google支持的官方语言,它还有很多优点比如说大大减少样板代码的数量避免空指针异常等整个类的错误,充分利用 JVM、Android 和浏览器的现有库,可用任何 Java IDE 或者使用命令行构建。

开门上车--kotlin的hello world!

Kotlin 程序文件以 .kt 结尾,如:hello.kt 、world.kt。

class KotlinTest(){
    fun hello(yourName : String){
        println("hello world $yourName")
    }
}
fun main(args: Array<String>) {
    KotlinTest().hello("Licz")
}

老司机平稳上路--基础语法介绍!

定义基础

  • 常变量定义
    在Kotlin中常量用val声明,变量用var声明,关键字还是在名称前面,类型用”:“隔开在名称后面,或者也可以直接省略类型直接在名称后用“=”赋值。
var <标识符> : <类型> = <初始化值>
val <标识符> : <类型> = <初始化值>
  • 空安全定义
    类型后带“?”表示空安全即可为空,名称后面带“?”以及“!!”分别表示可返回null即空安全和抛出空指针异常(简单理解?可以返回null即表示空安全,!!和java原本的类似,什么都不加编译器会在相对时刻检测报错)
//类型后面加?表示可为空
var age: String? = "23"
//抛出空指针异常
val ages = age!!.toInt()
  • 懒加载
    by lazy{} (多用于单例模式)只能用在val常量类型且只可以初始化一次想要多次初始化只能重新定义, lateinit 只能用在var变量类型并且不能用在java基本类型和可空类型且可以在任何位置初始化并且可以初始化多次
val name: String by lazy { "bestpay" }
lateinit var myTextView: Textview
  • 函数定义
    函数定义使用关键字 fun
    几种示范
fun sum(a: Int, b: Int){   // Int 参数,返回值 Int
    printlb( a + b )
}
fun sum(a: Int, b: Int): Int {   // Int 参数,返回值 Int
    return a + b
}
fun sum(a: Int, b: Int) = a + b
  • 字符串模版
    $ 表示一个变量名或者变量值,$varName 表示变量值,${varName.fun()} 表示变量的方法返回值:
var a = 1
val s1 = "a is $a" 
val s2 = "${s1.replace("is", "was")}, but now is $a" // 解释一下${}内部可以是函数表达式
  • 类型转换以及自检判断
    is 运算符检测一个表达式是否某类型的一个实例(类似于Java中的instanceof关键字)。
  if (obj is String) {
    // 做过类型判断以后,obj会被系统自动转换为String类型
    return obj.length 
  }
  if (obj is String && obj.length > 0)
    return obj.length

基础数据类型

  • Kotlin 的基本数值类型包括Byte、Short、Int、Long、Float、Double等。不同于Java的是,字符不属于数值类型,是一个独立的数据类型。其余基本同java。
  • 注意几点:
    16 进制以 0x 开头:0x0F;
    2 进制以 0b 开头:0b00001011;
    长整型以大写的 L 结尾:123L;
    Double 默认写法: 123.5, 123.5e10;
    Float 使用 f 或者 F 后缀:123.5f;
  • 也可以使用下划线使数字常量更易读(下划线无实际意义类似于注释的意思,怎么看着方便怎么加)
val oneMillion = 1_000_000
val creditCardNumber = 1234_5678_9012_3456L
val socialSecurityNumber = 999_99_9999L
val hexBytes = 0xFF_EC_DE_5E
val bytes = 0b11010010_01101001_10010100_10010010
  • Kotlin 中没有基础数据类型,只有封装的数字类型,你每定义的一个变量,其实 Kotlin 帮你封装了一个对象,这样可以保证不会出现空指针。数字类型也一样,所有在比较两个数字的时候,就有比较数据大小和比较两个对象是否相同的区别了。在 Kotlin 中,三个等号 === 表示比较对象地址,两个 == 表示比较两个值大小。

条件以及循环控制

  • 条件控制

    • if表达式
      和java那一套很类似,不过更强大
val max = if (a > b) a else b //作为表达式,取代了java的三元操作符
  • when表达式
    移除了switch使用更加强大的when代替,when的子式可以是常亮、变量、返回数值的表达式、返回boolean值的表达式,强大到替换if...else if
when (x) {
    1 -> print("x == 1")
    2 -> print("x == 2")
    //类似switch的用法
    3,4 -> print("x == 3 or x == 4")
    //由于没有break 如果两个值的处理逻辑一样可以这样用“,”隔开
    is String -> x.startsWith("prefix")
    //检测一个值是(is)或者不是(!is)一个特定类型的值
    else -> { // 注意这个括号
    //注意else相当于default
        print("x 不是 1 ,也不是 2")
    }
}

when (x) {
    in 1..10 -> print("x is in the range")
    !in validNumbers -> print("x is not valid")
    //此处在(in)或者不在(!in)一个区间(注意区间,这里没细说)
    else -> print("none of the above")
}

when {
    x.isGood() -> print("x is good")
    x.isBad() -> print("x is bad")
    else -> print("x is X")
    //此处为替代if...else if的用法
}
  • 循环控制

    • for循环
      有变化并且多出了几个变种
for (test in collection) print(test)//可以对任何提供迭代器(iterator)的对象进行遍历
for (test: Int in ints) {
//循环体是一个代码块
    // ……
}
  • while与do...while循环
    基本同java无区别
while( 布尔表达式 ) {
  //循环内容
}
do {
       //代码语句
}while(布尔表达式);
  • 返回和跳转
    return:默认从最直接包围它的函数或者匿名函数返回。
    break:终止最直接包围它的循环。
    continue:继续下一次最直接包围它的循环。
for (i in 1..8) {
        if (i==2) continue  // i 为 2 时跳过当前循环,继续下一次循环
        println(i)
        if (i>=5) break   // i 为 5 时 跳出循环
    }

类以及对象

  • 简述
    kotlin的类可以包含的和java代码的类差不多,有构造函数、内部类、对象声明、属性、函数,虽然类型差不多但是形式大大的不一样。
class Bestpay{ //类名称 bestpay
     fun writeBug(){println("bug")}
   //大括号内是类内部内容
}
class Empty //定义空类
  • 类属性
    var声明可变,val声明不可变
    注意一点kotlin中是没有new这个关键字的直接在“=”后面写要实例化的类就可以
    一般要使用一个类属性或某些方法只要在类后直接“.”属性名
class Test{ 
     val age : Int = 1
     val name : String = "test"
     fun writeBug(){println("bug")}
}
val bestpay = Test() //注意没有new关键字
bestpay.name
bestpay.age
  • 构造方法
    主构造方法注意constructor关键字(可省略)还有init()函数
class Person constructor(firstName: String) {}


class Person (firstName: String) {
//此处没有注解或者可见性修饰符省略constructor关键字
init{
//初始化代码块
//参数使用往上看!!! 就是类名称后面括号里面的东西!!!
firstName == “li”+firstName
}
}

次构造方法也叫做二级构造函数,需要加前缀constructor

class Person { 
    constructor(child: Person) {
        
    }
}


class Person(val name: String) {//主构造函数
    constructor (name: String, age:Int) : this(name) {//次构造函数
        // 初始化...
    }
    class Person(val name: String) {//主构造函数
    constructor (name: String, age:Int,firstName:String) : this(name,age) {//次构造函数
        // 初始化...
    }

注意如果类有主构造函数,每个次构造函数都要,或直接或间接通过另一个次构造函数代理主构造函数。在同一个类中代理另一个构造函数使用this关键字。

  • 抽象类
    abstract关键字了解一哈
  • 内部类
    内部类使用 inner 关键字来表示。
    内部类会带有一个对外部类的对象的引用,所以内部类可以访问外部类成员属性和成员函数。
class Test {
  val inn = "123"
    inner  class  innerTest{
        fun innertest(){
            var t =this@Test
            t.inn.equals(inn)
        }
    }
}
  • 嵌套类
    内部类包含嵌套类,嵌套类没有inner关键字

  • 匿名内部类
    定义和java类似,没有名字直接实例化使用,常用于接口等回调。

class Test {
    var v = "成员属性"

    fun setInterFace(test: TestInterFace) {
        test.test()
    }
}

/**
 * 定义接口
 */
interface TestInterFace {
    fun test()
}

fun main(args: Array<String>) {
    var test = Test()

    /**
     * 采用对象表达式来创建接口对象,即匿名内部类的实例。
     */
    test.setInterFace(object : TestInterFace {
    //注意此处接口的调用方式
        override fun test() {
            println("对象表达式创建匿名内部类的实例")
        }
    })
}
  • 类修饰符
    • classModifier: 类属性修饰符,标示类本身特性。
      abstract // 抽象类
      final // 类不可继承,默认属性
      enum // 枚举类
      open // 类可继承,类默认是final的
      annotation // 注解类
  • accessModifier: 访问权限修饰符
    private // 仅在同一个文件中可见
    protected // 同一个文件中或子类可见
    public // 所有调用的地方都可见(默认修饰符,什么都不加就是public)
    internal // 同一个模块中可见(包内可见)
  • 多嘴一句注意data类它是kotlin中特有的bean类用来写pojo超级方便
data class User(val name: String, val age: Int)

data class TestData(@SerializedName("success") var success: String, @SerializedName("errorCode") var errorCode: String) {
}

就这样简单的一个data class,加上主构造函数就构成了kotlin的特有pojo类它有编译器自动生成的equals()/hashCode()方法、toString()方法、componentN()方法、copy()方法以及“set/get”等方法。

一些补充

  • “:”冒号的妙用 类的继承、声明常变量的类型、函数的返回值等都有它的身影,除了以上还有Kotlin最终会还是编译成Java字节码,使用到Java类是必然的也是要用到“:”冒号的
val intent = Intent(this, Test::class.java)
  • 除了冒号还有一个较重要的符号@,this后面加上@对象表明指返回哪一个(内部类return处多用)
class User {
    inner class FamilyUser{
        fun getUser(): User{
            //返回User
            return this@User
        }
        fun getFamilyUser(): FamilyUser{
            //返回FamilyUser
            return this@FamilyUser
        }
    }
}

到站下车幼儿园的门在眼前--一些要说的东西!

在线代码编译工具
官方网站-中文版
基础教程
早期介绍视频

  • 暂时对databinding的支持不是很友好,一起使用会出现特别多奇葩的看不懂的错误。

  • butterknife无法使用,取而代之的是kotterknife(也是JakeWharton大神的作品)。

  • 转换为Kotlin工程最简单的方法Tools -> Kotlin -> Configure Kotin in Project。

  • Code/Conver Java File to Kotlin File单独的类转换成Kotlin代码。

  • 将Java代码复制到Kotlin文件会提示转换也是可以很方便的进行差异对比。

  • 但是有一句说一句哈ide转换出来的kotlin代码那是给机器看的 Orz。。。。。。。

  • 反射不是很好用,这部分需要引入一个很大的库来做,BUT 我们可以直接用java写。


kotlin-ktx

2018年2月5号的时候,Google 发布了一款 Kotlin 的扩展库,叫 Android KTX,它能使 Android 上的 Kotlin 代码更简洁,从而提高开发者的效率和使用体验。
Android KTX 其实就是一个 Kotlin 代码的扩展库,Google 把我们开发的时候,比较常用的一些代码块,进行封装,然后在这个基础上,提供更良好的 API,供开发者使用。
总的来说呢,这个东西就是java代码下的xxxUtils库,但是由于kotlin的 Extensions 特性,这个库可以使用起来有着媲美原生api的使用体验。
来看看ktx包下面都包括了什么!

[图片上传失败...(image-8d70d4-1527574739510)]

看了之后的感觉是不是很刺激?从animation到text,从view到net统统都有。
OK废话咱们就不多说了直接上码:
github地址
文档地址


关于应用Kotlin后的编译速度问题

此处直接引用一篇文章

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

推荐阅读更多精彩内容