我们都知道,在kotlin中,var定义的变量是可读可变的,而val定义的变量是只读不可变的,这是为什么呢?这里我们来看下面的代码:
class Player{
val name = "jack"
var age = 11
}
这里我简单的定义了一个Playerl类,里面有个val定义的变量name,还有一个var定义的变量age,我们把这段Kotlin代码转换为java代码来看下:
?这是转换后的java代码,这下我们就知道了,但我们用var定义的变量时,编译器会自动帮我们写好get和set方法,而当用val定义的变量时,只有get方法,外部没法调用set方法,这就是为什么var变量是可变的(因为可以调用它的set方法),val一般情况下,就是不能变的(没有set方法)。
其实,val也不是一定不能变的,在kotlin语言下,对于val变量的get()方法进行赋值的话,就可以修改val的值,但是官方不建议我们这么做,要想定义一个真正的完全不能修改的常量,就要用到编译时常量
编译时常量只能在函数之外定义。这是因为,编译时常量必须在编译时(程序编译时)赋值,而 函数都是在运行时(程序运行时)才调用,函数内的变量也是在那时赋值。编译时常量要在这些变量赋值前就已存在,在函数外使用 const val来定义编译时常量:
const val MAX = 100
fun main(){
print(MAX)
}
我们来看下翻译成Java代码是什么样的:
import kotlin.Metadata;
@Metadata(
mv = {1, 1, 16},
bv = {1, 0, 3},
k = 2,
d1 = {"\u0000\u000e\n\u0000\n\u0002\u0010\b\n\u0000\n\u0002\u0010\u0002\n\u0000\u001a\u0006\u0010\u0002\u001a\u00020\u0003\"\u000e\u0010\u0000\u001a\u00020\u0001X\u0086T¢\u0006\u0002\n\u0000¨\u0006\u0004"},
d2 = {"MAX", "", "main", "", "kotlinTest"}
)
public final class Kotlin01Kt {
public static final int MAX = 100;
public static final void main() {
byte var0 = 100;
boolean var1 = false;
System.out.print(var0);
}
// $FF: synthetic method
public static void main(String[] var0) {
main();
}
}
const val MAX = 100 变成了 public static final int MAX = 100
|