当前位置: 首页 > 知识库问答 >
问题:

大家好,有人能给我解释一下引用和被引用对象之间的区别吗?[副本]

钱飞翼
2023-03-14

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

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

共有1个答案

臧令
2023-03-14

请考虑执行以下代码:

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是imutable的,而varAttribute不是imutable的。

因此,当您运行reference.varattribute=“change”时,您不是在更改引用变量,而是在更改被引用的对象

 类似资料:
  • 我的问题是为什么第二版是Abhishek..我在vo4对象中保留了一个vo1对象的副本,而不是引用。这意味着它创造了一个新的记忆。vo1和vo4是不同的。那么为什么vo4.getname在第二次更改。我正在设置vo1对象,但vo4是自动更改的。为什么会发生??

  • 我不知道“?”和“:”的用法。

  • 问题内容: 我从“ Head First Java”学习“多态”,然后想到了这个概念。有人可以举例说明吗? 编译器检查引用类型的类,而不是对象类型。 那么引用类型和对象类型之间有什么区别? 问题答案: 我认为它们对“对象类型”和“引用类型”的使用不是标准化的,但这是我的解释。 考虑以下代码: 该 引用 是类型的。它引用的 对象 是类型。 因此,“引用类型”为,“对象类型”为。 造成这种混乱的原因是

  • 问题内容: 斯威夫特有: 强引用 参考文献薄弱 无人参考 无主引用与弱引用有何不同? 什么时候可以使用无主引用安全? 无主引用是否像C / C ++中的悬空指针一样具有安全风险? 问题答案: 双方并引用不创建一个被引用的对象上保持(又名它们不会取消分配引用的对象增加,为了保留计数,以防止电弧)。 但是为什么要两个关键词呢?这种区别与类型内置在Swift语言中这一事实有关。长话短说:可选类型提供了内

  • 变量、对象和引用之间到底有什么区别? 例如:它们都指向某种类型,并且它们都必须保存值(当然,除非您有临时的可null类型),但是它们的功能和实现之间有何不同? 例子: 它们有相同的概念,但又有什么不同呢?

  • 问题内容: Java中的单引号和双引号之间有区别吗? 问题答案: 对文字s 使用单引号,对文字s 使用双引号,如下所示: 不能以其他任何方式使用它们(例如,在Python中)。