欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Kotlin学习第一步 kotlin语法特性

程序员文章站 2022-06-29 15:26:14
今年 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有很多新特性,这还需要我们在开发中慢慢消化理解。

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