当前位置:嗨网首页>书籍在线阅读

02-变量声明

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

4.2.1 变量声明

在Kotlin中,任何变量都是对象,这意味着任何一个变量都可以调用成员函数和属性。Kotlin的变量声明并不像Java那么复杂,变量被简单地分为可变变量(var)和不可变变量(val)两种,而不可变变量又被称为常量。

这当中,var定义的对象是可变的,这意味着任何访问这个对象的代码都可以去修改它的值。val定义的对象是不可变的,它和Java中的final很相似,对于不可变对象可以认为是线程安全的,因为所有能访问到这个线程的对象得到的结果都是同一个。

val a = "hello a!"  //不可变
    println(a)   //输出hello a!
    var b = "hello "  //可变
    b = "hello b!"
    println(b)   //输出hello b!

当然,对于可变变量var来说,也可以先声明后初始化。

var a: Int
a = 30
println(a)   //输出30

不难发现,Kotlin在声明变量时可以不用指定确切的数据类型,给人的感觉就像它是一个弱类型的语言。其实不然,Kotlin是一个强类型语言,之所以不需要指定类型,是因为Kotlin的类型推理(Type inference)机制。例如,下面的情况会提示编译错误。

var name = "hello"  //编译器自动推断"name"为字符串类型
    name = 22    //赋值其他类型的值报错

在Java语法中,可以先定义一个变量,在使用的时候再初始化,也可以在初始化变量时设置一个默认值,防止在没有调用set方法之前就调用get方法,导致空指针报错。代码如下。

private Object data;
   //直接调用本方法会报错,因为没有调用setData()
  public Object getData() {    
        if (data==null){
            data = new Object();
        }
        return data;
  }
 public void setData(Object data) {
        this.data = data;
    }

Kotlin的类型系统致力于消灭空引用,也就要求开发者在定义变量时进行初始化。上面的代码可以转换为如下的Kotlin写法。

private var data: Any?=null   //初始化
fun getData(): Any{
    if (data == null) {
        data = Any()
    }
    return data!!    
}

当然,对于var类型的变量来说,还可以使用lateinit关键字来延迟初始化,但是val变量不具备这种特性。

fun main(args: Array<String>) {
    val info: Info = Info()
    info.initData()
    println(info.person.swim())   
}
class Info {
    lateinit var person: Person
    fun initData() {
        person = Person()
    }
}
class Person{
    fun swim() {
        println("人会游泳...")
    }
}

在定义Kotlin的变量时,应遵循以下规则。

  • 定义变量时使用var关键字,定义常量使用val关键字。
  • 定义变量时可以省略分号。
  • print()与println()都是打印方法,后者打印完之后会换一行。
  • $符号表示引用。