Kotin重要特性:

  • 类型推导:定义变量不再需要显示声明类型,由编译器自动推导出变量的类型 如 val a ="hello” val b = 5   val c = 10L
  • 表达式函数:  fun sum(x: Int, y: Int) = x + y // 省略了{},Kotlin支持这种用单行表达式与等号的语法来定义函数,叫作表达式函数体,作为区分,普通的函数声明则可叫作代码块函数体

val和var的使用规则

如果说var代表了varible(变量),那么val可看成value(值)的缩写。但也有人觉得这样并不直观或准确,而是把val解释成varible+final,即通过val声明的变量具有Java中的final关键字的效果,也就是引用不可变

我们可以在IntelliJ IDEA或Android Studio中查看val语法反编译后转化的Java代码,从中可以很清楚地发现它是用 final 实现这一特性的

val的含义:引用不可变 (变量一旦初始化就不能更改指向,但是可以更改变量指向的内容里的值) 因此,val声明的变量是只读变量,它的引用不可更改,但并不代表其引用对象也不可变。事实上,我们依然可以修改引用对象的可变成员。这跟Java中的final对象概念上是一样的。

java val类型 .val java_android

重要原则:优先使用val来声明变量更好的理解可以是:尽可能采用val、不可变对象及纯函数来设计程序。关于纯函数的概念,其实就是没有作用的函数,具备引用透明性。

因为引用不可变,val声明的变量只能被赋值一次,且在声明时不能省略变量类型。

在Kotlin编程中,我们推荐优先使用val来声明⼀个本身不可变的变量,这在大部分情况下更具有优势:


  • 这是⼀种防御性的编码思维模式,更加安全和可靠,因为变量的值永远不会在其他地方被修改(⼀些框架采用反射技术的情况除外);在Java中进行多线程开发时,由于Java的变量默认都是可变的,状态共享使得开发工作很容易出错不可变性则可以在很大程度上避免这⼀点
  • 不可变的变量意味着更加容易推理,越是复杂的业务逻辑,它的优势就越⼤。

既然有了val, 为什么还要使用var?


  • 因为var有更好的性能,占用内存更少。所以,尤其是可能在业务中需要存储大量的数据的数据结构,如集合遍历中使用var来计算结果等,显然采用var是其更加适合的实现方案。

在函数式开发中,我们优先推荐使用val和不可变对象来减少代码中的副作用,提升程序的可靠性和可组合性。在⼀些个别情况下,尤其是强调性能的代码中,用var定义局部变量会更加适合。


编译时常量


val声明的变量只能算是不可变的变量,但并不是一个常量,要定义一个真正意义上的常量,必须使用const, const只能修饰基本类型,且必须初始化


//编译时常量
const val b = 3

这样定义了一个编译时常量,等价于java的 static final int


字符串的定义和操作

java val类型 .val java_字符串_02

 和Java的字符串没什么不同,但是由于String是⼀个字符序列,所以我们可以直接对其进行遍历


java val类型 .val java_android_03


 还可以访问这个字符序列的成员:


java val类型 .val java_java val类型_04


 此外,Kotlin的字符串还有各种丰富的API,如:

java val类型 .val java_字符串_05

 更多字符串类方法可以查阅Kotlin API⽂档:String - Kotlin Programming Language


定义原生字符串

java val类型 .val java_android_06

 简而言之,用这种3个引号定义的字符串,最终的打印格式与在代码中所呈现的格式⼀致,而不会解释转化转义字符(正如上述例子中的\n),以及Unicode的转义字符(如\uXXXX)。比如,我们用字符串来描述一段HTML代码,用普通字符串定义时必须是这样子:

java val类型 .val java_java val类型_07

下:

java val类型 .val java_java val类型_08

字符串模板

java val类型 .val java_字符串_09

 此外,除了变量,我们当然也可以通过同样的方式把表达式插入字符串中,并且在${expression}中使用双引号。如:


java val类型 .val java_Java_10


字符串判等


Kotlin中的判等性主要有两种类型:


  • 结构相等。通过操作符==来判断两个对象的内容是否相等。
  • 引用相等。通过操作符===来判断两个对象的引用是否⼀样,与之 相反的判断操作符是! == 如果比较的是在运行时的原始类型,比如Int,那么===判断的效果也等价于==。


java val类型 .val java_Java_11