变量可以很简单地定义成可变(var)和不可变(val)的变量。这个与Java中使用的final很相似。但是不可变在Kotlin(和其它很多现代语言)中是一个很重要的概念。

一个不可变对象意味着它在实例化之后就不能再去改变它的状态了。如果你需要一个这个对象修改之后的版本,那就会再创建一个新的对象。这个让编程更加具有健壮性和预估性。在Java中,大部分的对象是可变的,那就意味着任何可以访问它这个对象的代码都可以去修改它,从而影响整个程序的其它地方。

Kotlin中有两个关键字定义变量,这两个关键字外形看着差别很小就只差了一个字母,但实际差别很大的。

var是一个可变变量,这是一个可以通过重新分配来更改为另一个值的变量。这种声明变量的方式和Java中声明变量的方式一样。

val是一个只读变量,这种声明变量的方式相当于java中的final变量。一个val创建的时候必须初始化,因为以后不能被改变。

不可变对象也可以说是线程安全的,因为它们无法去改变,也不需要去定义访问控制,因为所有线程访问到的对象都是同一个。所以在Kotlin中,如果我们想使用不可变性,我们编码时思考的方式需要有一些改变。一个重要的概念是:尽可能地使用val。除了个别情况(特别是在Android中,有很多类我们是不会去直接调用构造函数的),大多数时候是可以的。如果使用var一般都需要判空

val s = "Example" // A String
val i = 23 // An Int
val actionBar = supportActionBar // An ActionBar in an Activity context
var name: String? = null    //可变变量一般要注意使用安全操作符? ,使用时都要加上?
val length = name?.length

Kotlin中val和var的区别相关推荐

  1. Kotlin中also与apply的区别

    Kotlin中also与apply的区别 also和apply的差别主要存在于lambda表达式内context表示方式 also是通过传入的参数(it)来表示 apply是通过this来表示 als ...

  2. JS中 let 和var的区别

    JS中let和var 的区别 简单介绍let var的常见变量提升 ES6可以用let定义块级作用域变量 let配合for循环的独特应用 let没有变量提升与暂时性死区 let变量不能重复声明 简单介 ...

  3. uniapp 获取到js文件var一个变量怎么获取到这个变量值_浅析Js中const,let,var的区别及作用域...

    理解:let变量的作用域只能在当前函数中 js中const,let,var的区别及作用域_lianzhang861的博客-CSDN博客​blog.csdn.net 全局作用域中,用 const 和 l ...

  4. javascript中let和var的区别

    let是es6中新增命令,也是用来声明变量的,可能很多小伙伴都像我一样,定义变量的时候都会用var而很少用到let,那么,let和var到底有什么区别呢? let和var的区别体现在作用域上.var的 ...

  5. 前端中 let 和 var 的区别

    作用域不同 var是函数作用域,let是块作用域. 在函数中声明了var,整个函数内都是有效的,比如说在for循环内定义的一个var变量,实际上其在for循环以外也是可以访问的 而let由于是块作用域 ...

  6. val和var的区别

    美图欣赏: 一.背景 学习过程中,会有很多小的并且容易混淆知识点,因此会把它记录下来. 二.val(value)和var(variable)的区别 基本语法: var|val 变量名 : 变量类型 = ...

  7. js中let const var的区别

    1.var声明的变量会存在变量提升,而let 和 const的变量不会存在变量提升 也就是var声明的变量会被提升到他所在的作用域顶端去 // var: console.log(a) // 打印为 ' ...

  8. typescript 中 let和var的区别

    1,var可以声明同名变量,但let不可以: var a = 0; var a = 1; // 不会报错 let b= 0; let b = 1;  // 会报错 var的作用域是函数作用域,在内层循 ...

  9. Scala变量定义val与var的区别

    Scala有两种变量:var和val.val类似与Java种的final变量,一旦初始化了,就不能再被赋值.相反,var可以在生命周期内被多次赋值! 同样的代码,我把val改成var编译就没有问题了;

最新文章

  1. 10参数_小米10和oppofindx2哪个好用 参数配置对比性能评测
  2. 关于收到部分还款SAP系统两种处理方法的说明和比较
  3. 李秀计算机文化基础,计算机文化基础(李秀)绪论.pptx
  4. CSS3 linear-gradient实现三角形
  5. MySQL巧妙利用help_topic表把以逗号分隔的字符串转换成行
  6. IoT:BLE4.0教程一 蓝牙协议连接过程与广播分析
  7. 多项式函数插值:计算基本理论
  8. ❤ ❤响应式小米官网源码!!!(js+css+html)❤ ❤
  9. OBD柴油货车环保在线检测终端助力机动车尾气监管与时俱进
  10. 【npm】tunneling socket could not be established
  11. 违反协议 oracle,Oracle增加表字段导致“违反协议”异常
  12. React中的Hooks是什么?
  13. Opencv4.0学习记录(Day21 视频文件摄像头使用)
  14. 微信分享的app下载链接无法打开,显示已停止访问该网页的原因和解决方案
  15. 天敏VC4000视频开发设计方案
  16. npm ERR! code ERESOLVE npm ERR! ERESOLVE unable to resolve dependency tree
  17. 微信小程序——背景音乐播放
  18. 如何把谷歌浏览器内核设为百度?
  19. 常用的正则表达式校验
  20. android ios安裝,麻花影视最全安装途径 — 支持Android和iOS

热门文章

  1. TP开发的源码或素材付费下载站网站源码+整体不错
  2. 笔记:新手SEOer必备的WordPress优化插件
  3. 设置GPU及显存大小
  4. 春夜宴诸从弟桃李园序 李白
  5. 三星性能测试软件,三星T7 性能测试
  6. 将笔记本打造成遥控器――远程桌面控制台式机
  7. 如何提高文献检索能力?
  8. 什么是软考?软考有什么作用?
  9. Android SDKManger 更新设置
  10. airtest常用按键