Kotlin学习第一步 kotlin语法特性
今年 google i/o 2017 开发者大会中,google 宣布正式把 kotlin 纳入 android 程序的官方一级开发语言(first-class language),作为android开发者,当然要逐步熟悉这门语言,第一步就要从语法开始学习。
在这之前,我们需要了解怎么使用kotlin编写一个android应用。对于android studio 3.0版本,我们在创建工程的时候直接勾选 include kotlin support 选项就可以了;对于3.0以前的版本,我们需要安装kotlin插件,同时还要手动配置gradle,方法如下
在app的gradle下加入如下代码
apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions'
在project的gradle下加入如下代码
ext.kotlin_version = '1.1.2-3' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
kotlin定义变量
- kotlin 里的变量定义有两种,val 和 var,其中 val 等同 java 中 final 修饰的变量(只读),一般是常量,var一般是变量。
- kotlin 的变量定义支持赋值时类型推断,且所有变量默认被修饰为「不可为 null」,必须显式在类型后添加 ? 修饰符才可赋值为 null。
- 我们写代码时要尽量习惯性地将变量设计为不可为空,这样在后面对该变量的运算中会减少很多问题。
kotlin函数扩展
具体的语法是fun + 类型.函数(参数)
fun context.toast(message: string, length: int = toast.length_short) { toast.maketext(this, message, length).show() }
kotlin parcelable序列化
package com.john.kotlinstudy import android.os.parcel import android.os.parcelable /** * java bean 数据实体类 * created by john on 17-5-24. */ data class userbean(var name: string, var id: string) : parcelable { constructor(source: parcel) : this(source.readstring(), source.readstring()) override fun describecontents(): int { return 0 } override fun writetoparcel(dest: parcel, flags: int) { dest.writestring(this.name) dest.writestring(this.id) } companion object { @jvmfield val creator: parcelable.creator<userbean> = object : parcelable.creator<userbean> { override fun createfromparcel(source: parcel): userbean { return userbean(source) } override fun newarray(size: int): array<userbean?> { return arrayofnulls(size) } } } }
companion关键字解读
- 不像 java 或者 c#,在 kotlin 中,class 没有静态方法,在大多数情况下,推荐用 package-level 的函数来代替静态方法。
- 如果你需要写一个不需要实例化 class 就能访问 class 内部的函数(例如一个工厂函数),你可以把它声明成 class 内的一个实名 object。
- 另外,如果你在 class 内声明了一个 companion object,在该对象内的所有成员都将相当于使用了 java/c# 语法中的 static 修饰符,在外部只能通过类名来对这些属性或者函数进行访问。
@jvmfield 注解作用
- 指示kotlin编译器不为此属性生成getter / setter,并将其作为一个字段暴露出来。
- 如果您需要在java中公开kotlin属性作为字段,则需要使用@jvmfield注释对其进行注释,该字段将具有与底层属性相同的可见性。
kotlin 编写工具类
在java中,我们会将一些常用的功能封装成一个个工具类,工具类其实就是对于string,collection,io 等常用类的功能的扩展。我们写的工具类方法和变量都会写成静态的。因为,这些方法我们只是想调用一下,不需要牵扯工具类中的任何属性和变量,所以就没有必要实例化了(new),既然不需要实例化了,那么就用静态就行了。
package com.john.kotlinstudy import android.content.context import android.widget.toast /** * toast工具类 * created by john on 17-5-24. */ object toastutils { fun toast(context: context, message: string) { toast.maketext(context, message, toast.length_short).show() } }
kotlin activity 跳转
我们在mainactivity设置点击事件,跳转到另一个activity,同时传递数据过去
package com.john.kotlinstudy import android.content.context import android.support.v7.app.appcompatactivity import android.os.bundle import android.widget.toast import kotlinx.android.synthetic.main.activity_main.* class mainactivity : appcompatactivity() { override fun oncreate(savedinstancestate: bundle?) { super.oncreate(savedinstancestate) setcontentview(r.layout.activity_main) test_tv.text = "hello kotlin" test_tv.setonclicklistener { toastutils.toast(this, "hello kotlin") val user = userbean("zhang", "001") user.id = "100" secondactivity.navigateto(this, user) } } fun context.toast(message: string, length: int = toast.length_short) { toast.maketext(this, message, length).show() } }
然后新建一个secondactivity,提供一个静态方法,用于activity的跳转。想必大家都知道这样做的好处,就是让调用者不必看源码就知道需要什么参数。如果你按照java写,就会发现没有static这个关键字!不要慌,这里可以使用伴生对象来实现,伴生对象是伴随这个类声明周期的对象。
package com.john.kotlinstudy import android.content.context import android.content.intent import android.os.bundle import android.support.v7.app.appcompatactivity import kotlinx.android.synthetic.main.activity_second.* /** * 跳转activity测试类 * created by john on 17-5-24. */ class secondactivity : appcompatactivity() { override fun oncreate(savedinstancestate: bundle?) { super.oncreate(savedinstancestate) setcontentview(r.layout.activity_second) val user = intent.getparcelableextra<userbean>(extra_key_user) user_name_tv.text = user.name toastutils.toast(this, user.id) } //创建一个伴生对象 companion object { //extra的key val extra_key_user = "extra.user" fun navigateto(context: context, user: userbean) { val intent = intent(context, secondactivity::class.java) intent.putextra(extra_key_user, user) context.startactivity(intent) } } }
小结
以上只是简单的介绍了kotlin一些语法特性,算是入门,对这门新语言消除些许陌生恐惧,其实kotlin有很多新特性,这还需要我们在开发中慢慢消化理解。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。