首页 > 解决方案 > 大家好,有人可以向我解释一下引用和引用对象之间的区别吗?

问题描述

有人可以向我解释引用和被引用对象之间的区别吗?

请注意,变量引用 (var, val) 的类型与引用本身有关,而不是与被引用对象的属性有关。这意味着当使用只读引用 (val) 时,我们将无法更改指向特定对象实例的引用(我们将无法重新分配变量值),但我们仍然能够修改引用对象的属性。让我们使用数组来看看它的实际效果:

val list = mutableListOf("a","b","c") //1
list = mutableListOf("d", "e") //2 Error
list.remove("a") //3
  1. 初始化可变列表
  2. 编译器将抛出错误,因为值引用无法更改(重新分配)
  3. 编译器将允许修改列表的内容关键字 val 不能保证底层对象是不可变的。

标签: kotlin

解决方案


考虑执行以下代码:

data class ReferencedObject(
    val valAttribute: String, 
    var varAttribute: String
)

fun main() {
    val reference = ReferencedObject(
        valAttribute = "cant change",
        varAttribute = "can change"
    )

//    it doesn't compile because reference can't be reassigned
//    val reference = ReferencedObject(
//        valAttribute = "cant change",
//        varAttribute = "can change"
//    )

//    it doesn't compile because valAttribute of referenced object can't be reassigned
//    reference.valAttribute = "change"

    // it works because the var attribute of referenced object can be reassigned
    reference.varAttribute = "change"
}

在这个例子中,reference是一个指向类型对象的最终“变量” ReferencedObject。被引用的对象有两个属性:一个valAttribute是不可变的,varAttribute一个不是。

因此,当您运行时,reference.varAttribute = "change"您不会更改引用变量,而是更改引用的对象。

这就是您的示例中发生的情况,当您运行时,list.remove("a")您正在更改引用“变量”MutableList引用的对象的状态。list


推荐阅读