原文标题:Variables in Kotlin, differences with Java. var vs val (KAD 02)

作者:Antonio Leiva

时间:Nov 28, 2016

原文链接:http://antonioleiva.com/variables-kotlin/

Kotlin系列课程的第二课:Kotlin中变量不同于Java: var 对val。

在这第二章节中,我们将了解Kotlin中变量是怎样工作的,什么是val和var,什么时间使用它们。

我从这开始,是因为理解这部分内容对后续讨论怎样在类中创建“字段”时非常有用(还可了解它们不是字段)。

Kotlin变量

如Java那样,只要在变量的范围内执行代码,Kotlin变量就可以被赋值、修改,在程序中不同位置被使用。

但是,我们将聚焦在它与Java不同的方面。

  • 变量分可变的和不可变的

在Java中也分可变与不可变(如果不希望变量被改变,可将变量说明为final),但是在Kotlin中,更简洁的、更常用的是:只要可能,在Kotlin中首选时不变值。

事实上,在程序中大部分地方使用不可变的变量,可带来很多益处,如:可预测的行为和线程安全。

  • 用val或var声明变量,指明它们是不可变的或可变的

在Kotlin中有趣的是大部分情况你不需要说明你使用对象的类型,而编译器就是推断它。

所以,我们只需要依据要产生的变量类型填写var或val,其类型通常能够被推断出来。我们也可以明确地指定变量类型。

一些例子:

 var x = 7
var y: String = "my String"
var z = View(this)

说明:如你所见,你不需要用new来创建对象的新实例。

  • 类型转换是自动完成的

无论何时,编译器能够检测没有其它可选项,自动地完成类型转换。非常棒!

 val z: View = findViewById(R.id.my_view)

 if (z is TextView) {
z.text = "I've been casted!"
}

看见我没有调用setText()吗?这将在下一篇说明!

  • 在Kotlin中,所有都是对象

没有基本类型,没有void。如果有时没有返回值,实际时返回Unit对象。大多数情况下,Uint可以省略,但是它确实存在的,被隐藏了。

因此,所有这些比哪里都是对象:

 val x: Int = 20
val y: Double = 21.5
val z: Unit = Unit
  • 简洁的数字类型不能赋值给复杂的类型

例如,整形不能赋值长变量。下面的代码不能通过编译:

 val x: Int = 20
val y: Long = x

你需要明确的进行转换:

 val x: Int = 20
val y: Long = x.toLong()

结论

这些是在Java和Kotlin之间能够找出的明显不同之处。通常,Kotlin变量提供更加灵活的、安全的(由于任何可能时用val约定)和更清晰的、简洁的代码。

仍有疑问?准备阅读下篇!

Kotlin中变量不同于Java: var 对val(KAD 02)的更多相关文章

  1. Kotlin 变量和常量的声明(var和val)

    Kotlin有着非常非常智能化的声明变量方式.叫做类型推断 声明变量要使用关键字var和val. var声明方式第一种(自动推断): var nub=1231://自动定义整数型 使用分号 var c ...

  2. Kotlin技术入门以及和Java对比.md

    一.Kotlin基础环境搭建 Android studio的版本大于3.0 直接支持Kotlin语法,直接创建即可; Android studio的版本小于3.0,步骤如下: 需要下载插件 插件搜索 ...

  3. kotlin中的嵌套类与内部类

    Java中的内部类和静态内部类在Java中内部类简言之就是在一个类的内部定义的另一个类.当然在如果这个内部类被static修饰符修饰,那就是一个静态内部类.关于内部类 和静态内部类除了修饰符的区别之外 ...

  4. kotlin中使用Handler

    kotlin中使用Handler jumpToPayHandler = Handler { var questionformModel = QuetionFormModel(2, spinner.te ...

  5. Kotlin中与Java不同的地方 需要注意

    1. 在Kotlin中不会将基本数据类型的自动转型比如 scriptIntrinsicBlur.setRadius(25) //报错, 必须写成 25f 或者 调用.toFloat() 2.Kotli ...

  6. jsp中把js变量赋给java变量,或者将java变量赋给js变量怎么做?

    在jsp中经常会遇到把js变量赋给java变量,或者将java变量赋给js变量的情况,在此将通用的处理方法小结如下: java变量传给js好办,var a=”<%=javaParam%>“ ...

  7. java中变量命名和引用变量的一个坑

    这次有两个主题,第一个太简单啦,就是java中变量的命名规则,纯记忆性东西.第二个主题,就是讨论一下对象引用变量的一个注意点.

  8. Java多线程中变量的可见性

    之所以写这篇博客, 是因为在csdn上看到一个帖子问的就是这个问题. 废话不多说, 我们先看看他的代码(为了减少代码量, 我将创建线程并启动的部分修改为使用方法引用). 1 2 3 4 5 6 7 8 ...

  9. JavaScript中变量声明有var和没var的区别

    JavaScript中变量声明有var和没var的区别 JavaScript中有var和没var的区别 Js中的变量声明的作用域是以函数为单位,所以我们经常见到避免全局变量污染的方法是 (functi ...

随机推荐

  1. Hadoop 中利用 mapreduce 读写 mysql 数据

    Hadoop 中利用 mapreduce 读写 mysql 数据   有时候我们在项目中会遇到输入结果集很大,但是输出结果很小,比如一些 pv.uv 数据,然后为了实时查询的需求,或者一些 OLAP ...

  2. .net点选验证码实现思路分享

    哈哈好久没冒泡了,最进看见点选验证码有点意思,所以想自己写一个. 先上效果图 如果你被这个效果吸引了就请继续看下去. 贴代码前先说点思路: 1.要有一个汉字库,并按字形分类.(我在数据库里是安部首分类 ...

  3. Fis3的前端模块化之路[基础篇]

    Fis3版本:v3.4.22 fis3是一个构建工具 解决前端开发中自动化工具.性能优化.模块化框架.开发规范.代码部署.开发流程等问题. 安装 npm install -g fis3 运行 fis3 ...

  4. 问题记录:EntityFramework 一对一关系映射

    EntityFramework 一对一关系映射有很多种,比如主键作为关联,配置比较简单,示例代码: public class Teacher { public int Id { get; set; } ...

  5. Git分布式版本控制教程

    Git分布式版本控制Git 安装配置Linux&Unix平台 Debian/Ubuntu $ apt-get install git Fedora $ ) $ dnf and later) G ...

  6. VMware下对虚拟机Ubuntu14系统所在分区sda1进行磁盘扩容

    VMware下对虚拟机Ubuntu14系统所在分区sda1进行磁盘扩容 一般来说,在对虚拟机里的Ubuntu下的磁盘进行扩容时,都是添加新的分区,而并不是对其系统所在分区进行扩容,如在此链接中http ...

  7. 谁偷了我的热更新?Mono,JIT,iOS

    前言 由于匹夫本人是做游戏开发工作的,所以平时也会加一些玩家的群.而一些困扰玩家的问题,同样也困扰着我们这些手机游戏开发者.这不最近匹夫看自己加的一些群,常常会有人问为啥这个游戏一更新就要重新下载,而 ...

  8. 从零开始,DIY一个jQuery(1)

    从本篇开始会陪大家一起从零开始走一遍 jQuery 的奇妙旅途,在整个系列的实践中,我们会把 jQuery 的主要功能模块都了解和实现一遍. 这会是一段很长的历程,但也会很有意思 —— 作为前端领域的 ...

  9. 【腾讯Bugly干货分享】微信热补丁Tinker的实践演进之路

    本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57ad7a70eaed47bb2699e68e Dev Club 是一个交流移动 ...

  10. JNI 备注

    本文记录一个基础的JNI例子及过程中遇到的问题解决. 1.定义一个JAVA类如下: package jnidemo01; public class JniHello { public native v ...