一.变量声名,赋值和访问
kotlin 变量是空安全的,一般要求声明时就赋值。声名变量有两个关键字var
和val
,其中val
相当于 java 的中的final
。变量类型可显式给出,也可隐式推断。变量也可分可空类型和非空类型。以下给出几种声名和初始化示例说明
var a:String="hello" //显式声明String 类型变量
private var b="hello" //隐式声明,可推断为String类型变量
var c:String?=null //可空的 String 类型变量,可空类型必需显式给出类型
lateinit var d:String //String 类型变量,可延迟但必须在使用前要赋值,仅变量支持。
internal val e="hello" //常量
val f:String by lazy { "hello" } //懒加载属性,首次使用才会初始化。
可空变量访问需要强制判断空,见下面示例:
var name:String?=null;
val len1=name!!.length //如果name 为空就会报NPE
val len2=name?.length?:0 //为空时返回0,"?."只有不空时才执行后面语句否则返回null.
在kotlin中变量都会自动有隐式的有get和set属性,访问可见性同声明变量的访问属性,这在 java 中是要对变量额外写一堆 get 和 set 方法。 kotlin 的属性的 get 和 set 的访问可见性和属性访问也都是重写的见下面示例:
var name:String="won't null" //name 的访问级别为public
get() {
return field} //属性的访问器需要有内置field 去引用
private set(value) { //set操作访问重写为private级别
if(value.isNotEmpty()){
field=value //改写设置器只接受非空字符
}
}
在 java 中有个 volatile 修饰变量来解决多线程访问变量一致性问题,这种作用的关键字在 kotlin 中是没有的,不过它提供了注解的方式达到相同的功能即:@Volatile 来注解修饰某个变量。kotlin 的每个变量在编译生成 class 字节码中都会有相应的get和set方法,仅val
的变量是没有 set 方法的(常量 set 无意义).如果我们想强制让变量像 java一样,而不会编译生成访问器可用 @JvmField 来注解变量。
二.控制语句和运算符
kotlin有的表达式和java差不多,但它没有 java 的逗号表达式和switch 表达式,不过有很好的代替方案:java 的逗号表达式在kotlin中可用Elvis操作符可 if-else代之,而 switch 表达式可用新加的 when 表达式代替。见下例使用
var score=8
val grade=when(score){
9,10 ->"Excellent"
7,8 -> "Good"
6 -> "ok"