Java转Kotlin:变量与常量

318 阅读2分钟

1 var与val

var是variable的缩写,用于声明可读写属性

val是value的缩写,用于声明只读属性

1.1 使用举例

var的使用如下,定义了类Person的可读写属性:

//Kotlin
class Person {
    var age: Int = 0//必须负责变量声明之后的初始化
}

相当于Java的:

//Java
class Person {
    public int age;
}

val的使用如下,定义了类Person的只读属性:

//Kotlin
class Person {
    val age : Int = 0
}

相当于Java的:

//Java
class Person {
    public final int age = 0;//必须声明时初始化
}

1.2 只读属性

注意!上面一直强调val声明的是只读属性,而不是常量。原因很简单,Kotlin中所有的量都称为属性(Property),一般来说,属性由一个存储属性状态的属性值和它的getter、setter组成,而val声明的只读属性只有getter,没有setter,同时,getter完全可以返回一个表达式,因此,val声明的是一个只读属性,而非常量。

例如:

//Kotlin
class Person {
    val age: Int
        get() {
            return (Math.random()*100).toInt()
        }
}

fun main() {
    val person = Person()
    println(person.age)//每一次运行,打印的是一个随机数,而非常量
}

2 常量

2.1 基本常量

Kotlin中声明常量需要使用const关键字,有以下几个注意事项:

  1. 一般常量定义在全局范围内,若定义在类的内部,需要定义成类的伴生对象,相当于Java的static final
  2. 只能修饰基本数据类型;
  3. 必须在声明时立刻用字面量完成初始化。
//Kotlin
class P {
    companion object {
        const val a = 10//定义在类内部
    }
}

const val b = 10//定义在全局范围内

fun main() {
    println(P.a)
    println(b)
}

2.2 常量引用

常量引用强调的是引用与堆上对象之间的指向关系不能变,具体对象内容是可以改变的。

2.3 编译器常量与运行时常量

例如Kotlin中:

//Kotlin
fun main() {
    val c: Int
    if (Math.random().toInt() * 100 % 2 == 0) {
        c = 20
    } else {
        c = -20
    }
}

小结