我最近读了关于const关键字的文章,我很困惑!我找不到const和val关键字之间的任何区别,我的意思是我们可以用它们来创建一个不可变变量,还有什么我遗漏的吗?


当前回答

const kotlin到Java

const val Car_1 = "BUGATTI" // final static String Car_1 = "BUGATTI";

val kotlin to Java

val Car_1 = "BUGATTI"   // final String Car_1 = "BUGATTI";

简单地说

const变量的值在编译时已知。 val的值用于在运行时定义常量。

示例1 -

const val Car_1 = "BUGATTI" ✔  
val Car_2 = getCar() ✔    
const val Car_3 = getCar() ❌ 

//Because the function will not get executed at the compile time so it will through error

fun getCar(): String {
    return "BUGATTI"
}

这是因为getCar()在运行时被求值并将值赋给Car。

此外,

Val是只读的意味着在运行时是不可变的 Var是在运行时已知的可变变量 Const是不可变的,并且是编译时已知的变量

其他回答

const kotlin到Java

const val Car_1 = "BUGATTI" // final static String Car_1 = "BUGATTI";

val kotlin to Java

val Car_1 = "BUGATTI"   // final String Car_1 = "BUGATTI";

简单地说

const变量的值在编译时已知。 val的值用于在运行时定义常量。

示例1 -

const val Car_1 = "BUGATTI" ✔  
val Car_2 = getCar() ✔    
const val Car_3 = getCar() ❌ 

//Because the function will not get executed at the compile time so it will through error

fun getCar(): String {
    return "BUGATTI"
}

这是因为getCar()在运行时被求值并将值赋给Car。

此外,

Val是只读的意味着在运行时是不可变的 Var是在运行时已知的可变变量 Const是不可变的,并且是编译时已知的变量

const是编译时常量。这意味着它们的值必须在编译时赋值,而不像val那样可以在运行时赋值。

这意味着,const永远不能被赋值给函数或任何类构造函数,而只能赋值给String或原语。

例如:

const val foo = complexFunctionCall()   //Not okay
val fooVal = complexFunctionCall()  //Okay

const val bar = "Hello world"           //Also okay

再补充一下卢卡的回答:

编译时常量 在编译时已知值的属性可以使用const修饰符标记为编译时常量。这些属性需要满足以下要求: 对象声明或伴生对象的顶级或成员。 初始化为String类型或基本类型的值 没有自定义getter 这些属性可以在注释中使用。

来源:官方文件

因为我读了很多,“val”意味着不可变:这绝对不是这样的,看看这个例子:

class Test {
    var x: Int = 2
    val y
        get() = x
}

fun main(args: Array<String>) {
    val test = Test()
    println("test.y = ${test.y}") // prints 2
    test.x = 4
    println("test.y = ${test.y}") // prints 4
}

遗憾的是,真正的不可变性目前只能通过const -实现,但这只能在编译时实现。在运行时,你不能创建真正的不变性。

val只是表示“只读”,你不能直接改变这个变量,只能像我在上面的例子中显示的那样间接改变。

val

与Kotlin var关键字相比,Kotlin val关键字用于只读属性。只读属性的另一个名称是不可变的。

芬兰湾的科特林代码:

val variation: Long = 100L

Java的等效代码如下所示:

final Long variation = 100L;

康斯特瀑布

我们也对不可变属性使用const关键字。Const用于编译时已知的属性。这就是区别。考虑到const属性必须全局声明。

Kotlin代码(游乐场):

const val WEBSITE_NAME: String = "Google"

fun main() {    
    println(WEBSITE_NAME)
}

Java代码(在操场):

class Playground {

    final static String WEBSITE_NAME = "Google";

    public static void main(String[ ] args) {
        System.out.println(WEBSITE_NAME);
    }
}