Kotlin学习第一步 kotlin语法特性


Posted in Javascript onMay 25, 2017

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

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

Javascript 相关文章推荐
js的Boolean对象初始值示例
Mar 04 Javascript
javascript中with()方法的语法格式及使用
Aug 04 Javascript
在Node.js应用中使用Redis的方法简介
Jun 24 Javascript
jQuery插件pagewalkthrough实现引导页效果
Jul 05 Javascript
javascript中的作用域和闭包详解
Jan 13 Javascript
修复jQuery tablesorter无法正确排序的bug(加千分位数字后)
Mar 30 Javascript
RequireJS多页面应用实例分析
Jun 29 Javascript
echarts饼图扇区添加点击事件的实例
Oct 16 Javascript
vue+express 构建后台管理系统的示例代码
Jul 19 Javascript
React+Webpack快速上手指南(小结)
Aug 15 Javascript
怎么理解wx.navigateTo的events参数使用详情
May 18 Javascript
探索浏览器页面关闭window.close()的使用详解
Aug 21 Javascript
jQuery Masonry瀑布流布局神器使用详解
May 25 #jQuery
jQuery模拟实现天猫购物车动画效果实例代码
May 25 #jQuery
jquery.masonry瀑布流效果
May 25 #jQuery
Node.js操作redis实现添加查询功能
May 25 #Javascript
浅谈struts1 &amp; jquery form 文件异步上传
May 25 #jQuery
详解Vue中过度动画效果应用
May 25 #Javascript
基于vue实现swipe轮播组件实例代码
May 24 #Javascript
You might like
php循环检测目录是否存在并创建(循环创建目录)
2011/01/06 PHP
使用XDebug调试及单元测试覆盖率分析
2011/01/27 PHP
PHP中实现获取IP和地理位置类分享
2015/02/10 PHP
PHP实现基于图的深度优先遍历输出1,2,3...n的全排列功能
2017/11/10 PHP
PHP共享内存使用与信号控制实例分析
2018/05/09 PHP
PHP连接MySQL数据库的三种方式实例分析【mysql、mysqli、pdo】
2019/11/04 PHP
仅IE9/10同时支持script元素的onload和onreadystatechange事件分析
2011/04/27 Javascript
js格式化货币数据实现代码
2013/09/04 Javascript
javascript中直接引用Microsoft的COM生成Word
2014/01/20 Javascript
jquery动态改变div宽度和高度
2015/02/09 Javascript
JS+CSS实现带小三角指引的滑动门效果
2015/09/22 Javascript
vue-router跳转页面的方法
2017/02/09 Javascript
javascript设计模式之模块模式学习笔记
2017/02/15 Javascript
jQuery中绑定事件bind() on() live() one()的异同
2017/02/23 Javascript
基于js中this和event 的区别(详解)
2017/10/24 Javascript
vue实现密码显示隐藏切换功能
2018/02/23 Javascript
angularJs提交文本框数据到后台的方法
2018/10/08 Javascript
Webpack 4如何动态切割JS注入文件名详解
2019/07/09 Javascript
浅谈vue使用axios的回调函数中this不指向vue实例,为undefined
2020/09/21 Javascript
Python 文件处理注意事项总结
2017/04/10 Python
Python处理Excel文件实例代码
2017/06/20 Python
详解通过API管理或定制开发ECS实例
2018/09/30 Python
pygame游戏之旅 添加碰撞效果的方法
2018/11/20 Python
python实现的自动发送消息功能详解
2019/08/15 Python
python实现FTP文件传输的方法(服务器端和客户端)
2020/03/20 Python
python GUI模拟实现计算器
2020/06/22 Python
python 基于opencv操作摄像头
2020/12/24 Python
Sunglasses Shop英国:欧洲领先的太阳镜在线供应商之一
2018/09/19 全球购物
Does C# support multiple inheritance? (C#支持多重继承吗)
2012/01/04 面试题
大一学生假期实习的自我评价
2013/10/12 职场文书
开工仪式策划方案
2014/05/23 职场文书
工会主席事迹材料
2014/06/03 职场文书
教师遵守党的政治纪律情况对照检查材料
2014/09/26 职场文书
2015年初中生自我评价范文
2015/03/03 职场文书
酒店采购员岗位职责
2015/04/03 职场文书
Go标准容器之Ring的使用说明
2021/05/05 Golang