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对象概念上是一样的。
重要原则:优先使用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的字符串没什么不同,但是由于String是⼀个字符序列,所以我们可以直接对其进行遍历:
还可以访问这个字符序列的成员:
此外,Kotlin的字符串还有各种丰富的API,如:
更多字符串类方法可以查阅Kotlin API⽂档:String - Kotlin Programming Language
定义原生字符串
简而言之,用这种3个引号定义的字符串,最终的打印格式与在代码中所呈现的格式⼀致,而不会解释转化转义字符(正如上述例子中的\n),以及Unicode的转义字符(如\uXXXX)。比如,我们用字符串来描述一段HTML代码,用普通字符串定义时必须是这样子:
采用原生字符串的格式,会非常方便。如下:
字符串模板
此外,除了变量,我们当然也可以通过同样的方式把表达式插入字符串中,并且在${expression}中使用双引号。如:
字符串判等
Kotlin中的判等性主要有两种类型:
-
结构相等。通过操作符==来判断两个对象的内容是否相等。
-
引用相等。通过操作符===来判断两个对象的引用是否⼀样,与之 相反的判断操作符是! == 。如果比较的是在运行时的原始类型,比如Int,那么===判断的效果也等价于==。