“ const”和“ val”有什么区别?

与其他编程语言一样,在Kotlin中,属性可以是可变的(可以更改)或不可变的(不能更改)。我们使用关键字const并val声明一个不可变的属性。开发人员常常对这些术语感到困惑,例如何时使用哪个术语;

在Kotlin中使用“ const”

所述const关键字被用于声明那些不可变在本质即,这些属性是只读属性的属性。

但是,这些属性的值必须仅在编译时才知道,这const就是也称为编译时常量的原因。因此,在const变量中不允许在运行时分配值。

属性必须满足以下条件才能成为const属性:

必须是顶级对象,或者是对象的成员,或者是伴随对象的成员

必须使用String类型或原始类型进行初始化

没有自定义吸气剂

因此,您不能将const变量分配给函数或某些类,因为在这种情况下,变量将在运行时而不是在编译时进行初始化。

在KOTLIN中使用“ VAL”

该val关键字也用于只读属性。但是const和之间的主要区别在于val,val属性也可以在运行时进行初始化。

因此,您可以将val变量分配给函数或某些类。

例子

const val companyName = "MindOrks" // this will work
val comapanyname = "MindOrks" // this will work


const val companyName = getCompanyName() // will not work
val companyName = getCompanyName() // this will work

在上面的示例中,我们将其companyName用作不可变变量。使用时const,如果直接分配该值就可以了,但是如果尝试从某个函数分配该值getCompanyName,则将收到错误消息,因为此处将在运行时而不是在编译时分配该值。但是在情况下val,两种情况都可以。

 

当我们可以使用“ VAL”时为什么要使用“ CONST”?

在前面的示例中,我们看到了val变量的值是在运行时和const编译时初始化的。那么,const如果可以使用,为什么要使用val呢?

让我们通过另一个真实的Android示例来了解constand的用例val:

TestClass{
    companion object {    
        const val FILE_EXTENSION = ".png"    
        val FILENAME: String        get() = "Img_" + System.currentTimeMillis() + FILE_EXTENSION 
    }}

在上面的示例中,我们const在伴随对象中声明了名为FILE_EXTENSION的变量,并声明了该FILENAME变量,val并使用自定义getter对其进行了初始化。

由于文件的扩展名将始终相同,因此将其声明为const变量。但是,文件名将根据我们用于文件名的逻辑进行更改。在这里,在我们的示例中,我们基于当前时间来命名文件。您最初不能给它一些值,因为该值是在运行时获取的。因此,我们在val这里使用。

在代码编译之后发生的事情是,无论代码const中使用了什么变量,这些变量都会被该const变量的值替换,但是在的情况下val,这些变量将保持原样,因为我们不知道valat编译的值-时间。因此,如果您对上述代码进行反编译,那么您将看到(了解如何将Kotlin代码隐藏到Java中):

public final String getFileName() {
   return "Img_" + System.currentTimeMillis() + ".png";
}

在这里,您可以发现该变量FILE_EXTENSION已被其值替换,即“ .png”,即该值已被内联,因此在运行时访问该变量没有开销。这是使用constover的优势val。

这全都涉及Kotlin中const和val关键字之间的区别

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在 C++ 中,这两种语法的区别在于 const 关键字的位置不同,它们分别表示: 1. `const class object(params);`:表示创建一个 const 对象,即该对象不能被修改。在这种情况下,const 修饰的是整个对象,即对象本身是一个常量。这意味着,该对象的成员变量和成员函数都不能被修改。 2. `class const object(params);`:表示创建一个常量对象的类类型限定符,即该对象的成员函数不能修改对象的状态。在这种情况下,const 修饰的是对象的类型,即对象的成员函数是常成员函数,不能修改对象的状态。 下面是一个示例代码: ```cpp class MyClass { public: void setValue(int val) { value = val; } int getValue() const { return value; } private: int value; }; int main() { const MyClass obj1(10); // 创建一个 const 对象 MyClass const obj2(20); // 创建一个常量对象的类类型限定符 // 对象的成员函数不能修改对象的状态 // obj1.setValue(20); // 错误,const 成员函数不能修改对象的状态 // obj2.setValue(30); // 错误,const 成员函数不能修改对象的状态 // 对象的成员变量不能被修改 int val1 = obj1.getValue(); // 正确,可以调用 const 成员函数来获取对象的成员变量 int val2 = obj2.getValue(); // 正确,可以调用 const 成员函数来获取对象的成员变量 // obj1.value = 20; // 错误,对象是 const 类型,不能修改成员变量 // obj2.value = 30; // 错误,对象是 const 类型,不能修改成员变量 return 0; } ``` 在上面的示例中,我们创建了两个对象 `obj1` 和 `obj2`,一个是 const 对象,一个是常量对象的类类型限定符。由于这两个对象都是常量,所以它们的成员变量均不能被修改,只能通过成员函数来获取它们的值。此外,这两个对象的成员函数也不能修改对象的状态,只能读取对象的成员变量。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农乐园

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值