当前位置: 移动技术网 > IT编程>开发语言>JavaScript > Kotlin学习第一步 kotlin语法特性

Kotlin学习第一步 kotlin语法特性

2018年04月29日  | 移动技术网IT编程  | 我要评论
今年 google i/o 2017 开发者大会中,google 宣布正式把 kotlin 纳入 android 程序的官方一级开发语言(first-class langu

今年 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有很多新特性,这还需要我们在开发中慢慢消化理解。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持移动技术网。

如您对本文有疑问或者有任何想说的,请 点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网