Kotlin 值与赋值中的引用

Rar*_*ima 2 oop reference class object kotlin

我需要让一个班级引用另一个班级。不是创建它的副本,而是对已经存在的实例进行实际引用。

我也许可以用一个例子更好地解释它。我们有没有课Image

class Image(imgPath: String) {
    val height   : Int
    val width    : Int
    val rgbMatrix: MutableList< MutableList< Triple<Int, Int, Int> > >

    /* ... etc. ... */
}
Run Code Online (Sandbox Code Playgroud)

现在说我想要一个ImageManager只引用一个已经存在的类Image

class ImageManager(val img: Image) {
   /* ... */
}
Run Code Online (Sandbox Code Playgroud)

所以我可以有这种行为:

val image = Image("/res/images/image.png")

val imageManager = ImageManager(image)

// Setting the pixel at (125, 25) to black
imageManager.img.rgbMatrix[125, 25] = Triple(0, 0, 0)

// Should print the update value(0, 0, 0)
print( image.rgbMatrix[125, 25] )
Run Code Online (Sandbox Code Playgroud)

我的问题是:

  1. 在 Kotlin 中,什么时候在赋值中分配一个引用,什么时候分配一个副本?

  2. 我如何确定什么时候发生什么类型的分配?

  3. 官方文档中是否有详细说明的部分?如果有我找不到它。

提前致谢!

hot*_*key 6

与 Java 类似,Kotlin 从不在赋值时隐式复制对象。变量始终持有对对象的引用,并且将表达式分配给变量只会复制对对象的引用,而不是对象本身。

在内部,每个值可以是一个原语(IntBooleanChar等)或参考。当一个值被赋值时,结果要么是原语的副本,要么是对同一对象的引用的副本,这永远不会导致被引用的对象被复制。

据我所知,这种行为没有明确记录;相反,它被假定为与 Java 中的相同。

另请参阅:Kotlin 是“按值传递”还是“按引用传递”?