kotlin - 大家好,有人可以向我解释一下引用和引用对象之间的区别吗?
问题描述
有人可以向我解释引用和被引用对象之间的区别吗?
请注意,变量引用 (var, val) 的类型与引用本身有关,而不是与被引用对象的属性有关。这意味着当使用只读引用 (val) 时,我们将无法更改指向特定对象实例的引用(我们将无法重新分配变量值),但我们仍然能够修改引用对象的属性。让我们使用数组来看看它的实际效果:
val list = mutableListOf("a","b","c") //1
list = mutableListOf("d", "e") //2 Error
list.remove("a") //3
- 初始化可变列表
- 编译器将抛出错误,因为值引用无法更改(重新分配)
- 编译器将允许修改列表的内容关键字 val 不能保证底层对象是不可变的。
解决方案
考虑执行以下代码:
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
推荐阅读
- python - 如果我想加入数据框中重复的一些列?
- css - 在移动设备和平板设备上禁用悬停
- python - 使用 imread 下载图像数据集时出错
- spring-boot - 如何在 Spring Boot 2.x 中使用 HttpSerletRequest?
- certbot - 如何查看 Certbot 制作的 SSL 证书中的所有域?
- php - PHP:调用时函数未运行,返回1
- javascript - Select2:通过vue js中的onclick事件加载后不起作用
- c# - 如何制作边界线
- javascript - 使用 jQuery 动态生成的文本框
- cron - Cron 作业将 Stdout/Stderr 重定向到日志文件和仅邮件 Stderr