kotlin中的var和val与编译时常量

我们都知道,在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
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值