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 相关文章推荐
jquery radio 操作代码
Mar 16 Javascript
利用javascript判断文件是否存在
Dec 31 Javascript
js自动查找select下拉的菜单并选择(示例代码)
Feb 26 Javascript
js语法学习之判断一个对象是否为数组
May 13 Javascript
JavaScript类型系统之正则表达式
Jan 05 Javascript
BootStrap Table 分页后重新搜索问题的解决办法
Aug 08 Javascript
jQuery中值得注意的trigger方法浅析
Dec 12 Javascript
详解Vue-基本标签和自定义控件
Mar 24 Javascript
Angular在模板驱动表单中自定义校验器的方法
Aug 09 Javascript
vue 通过下拉框组件学习vue中的父子通讯
Dec 19 Javascript
vue.js 实现评价五角星组件的实例代码
Aug 13 Javascript
Postman如何实现参数化执行及断言处理
Jul 28 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
BBS(php &amp; mysql)完整版(一)
2006/10/09 PHP
PHP的简易冒泡法代码分享
2012/08/28 PHP
wordpress自定义url参数实现路由功能的代码示例
2013/11/28 PHP
phpmailer中文乱码问题的解决方法
2014/04/22 PHP
php投票系统之增加与删除投票(管理员篇)
2016/07/01 PHP
JavaScript学习笔记之获取当前目录的实现代码
2010/12/14 Javascript
Javascript面向对象编程(三) 非构造函数的继承
2011/08/28 Javascript
javascript作用域和闭包使用详解
2014/04/25 Javascript
angularjs客户端实现压缩图片文件并上传实例
2015/07/06 Javascript
JavaScript+html5 canvas制作的圆中圆效果实例
2016/01/27 Javascript
JS实现兼容各种浏览器的高级拖动方法完整实例【测试可用】
2016/06/21 Javascript
JSONP跨域请求实例详解
2016/07/04 Javascript
你知道setTimeout是如何运行的吗?
2016/08/16 Javascript
详解react-webpack2-热模块替换[HMR]
2017/08/03 Javascript
jQuery+SpringMVC中的复选框选择与传值实例
2018/01/08 jQuery
微信小程序外卖选购页实现切换分类与数量加减功能案例
2019/01/15 Javascript
vue按需加载实例详解
2019/09/06 Javascript
JavaScript对象原型链原理解析
2020/01/22 Javascript
vue 在methods中调用mounted的实现操作
2020/08/07 Javascript
nodejs中内置模块fs,path常见的用法说明
2020/11/07 NodeJs
[50:17]Newbee vs Serenity 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
[01:07:15]DOTA2-DPC中国联赛 正赛 DLG vs XG BO3 第二场 1月25日
2021/03/11 DOTA
python使用beautifulsoup从爱奇艺网抓取视频播放
2014/01/23 Python
python使用多线程不断刷新网页的方法
2015/03/31 Python
java判断三位数的实例讲解
2019/06/10 Python
Keras构建神经网络踩坑(解决model.predict预测值全为0.0的问题)
2020/07/07 Python
Python爬虫简单运用爬取代理IP的实现
2020/12/01 Python
Python开发.exe小工具的详细步骤
2021/01/27 Python
python UIAutomator2使用超详细教程
2021/02/19 Python
浅谈HTML5 Web Worker的使用
2018/01/05 HTML / CSS
信息管理专业学生自荐信格式
2013/09/22 职场文书
业务经理的岗位职责
2013/11/16 职场文书
努力学习演讲稿
2014/05/10 职场文书
2014领导班子正风肃纪思想汇报
2014/09/18 职场文书
2014领导班子专题民主生活会对照检查材料思想汇报
2014/09/23 职场文书
2014年服务员个人工作总结
2014/12/23 职场文书