Kotlin基础 — const

本文介绍了Kotlin中的const关键字,它使得属性可以以public static final的形式暴露给Java。主要区别在于,const修饰的属性只能拼接const属性,且在Java中直接以静态字段访问,而普通val属性在Java中需通过getter调用。建议在定义常量时使用const val以提高效率。

一、前言

一般kotlin用到的是var和val
- var:变量(读写)
- val:常量(只读)

但同时提供了一个const,val其实具有了大部分const拥有的功能,但是仔细对比了半天发现没什么卵用,但是又仔细一看,还有有点卵用的

 

二、介绍

查看kotlin in action,pdf文档里面介绍。大致意思是在kotlin中的顶级属性,会以getter(val 和 var)/setter(var才有)的形式暴露给Java,如果你想让其以public static final的字段呈现给调用者,可以val前面加上const修饰符。

注:kotlin中const只能用在顶级属性,以及object对象的属性中(伴随对象也是obejct)。

三、区别

1.经过const修饰的属性只能用拼接const修饰的属性去拼接

//const报错1
val testName = "ZhangSan"
//const报错2
var testName = "ZhangSan"
//正确
const val testName = "ZhangSan"



const val constNameNormal: String = "constNameNormal$testName"
val nameNormal: String = "nameNormal$testName"

 

2.在java中引用不同

//带1的属性是没有用const修饰的,没带1的属性是用了const修饰的
const val age: Int = 28
val age1: Int = 28

object test1 {
    const val name: String = "liuliqianxiao"
    val name1: String = "liuliqianxiao"
}

class Person {
    companion object {
        const val sex: Int = 1
        val sex1: Int = 1
    }
}

在kotlin中的调用如下

class Text{

    fun main(args: Array<String>) {
        println(age)
        println(test1.name)
        println(Person.sex)

        println(age1)
        println(test1.name1)
        println(Person.sex1)
    }
}

在java中的调用如下

public class Test {

    public static void main(String[] args) {
        //在没有加const修饰时应该如此调用
        //top-level属性,
        System.out.println(ConstTest.getAge1());
        //单列对象的属性
        System.out.println(test1.INSTANCE.getName1());
        //类的伴随对象的属性
        System.out.println(Person.Companion.getSex1());


        //加了const修饰之后的调用
        System.out.println(ConstTest.age);
        System.out.println(test1.name);
        System.out.println(Person.sex);

    }

}

 

 

从字节码我们可以看到const val 和val修饰对象的主要区别是:

 

  • 没有使用const ,在kotlin中,都是直接引用的。在java中,必须写全路径,通过getter方法获取。
  • const val 可见性为public final static,可以直接访问。
  • val 可见性为private final static,并且val 会生成方法getNormalObject(),通过方法调用访问。

 

四、总结

当定义常量时,出于效率考虑,我们应该使用const val方式,避免频繁函数调用。


 

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值