在Kotlin中,如果将对象传递给类的新实例,然后更改某些属性,它是否会在原始对象中更改?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Kotlin中,如果将对象传递给类的新实例,然后更改某些属性,它是否会在原始对象中更改?相关的知识,希望对你有一定的参考价值。

问题出现在标题中:在Kotlin中,如果将对象传递给类的新实例,然后更改某些属性,它是否会更改原始对象中的属性? Image我有以下情况:

class User{
   var name: String = "initial name"
}
class UserHolder{
   companion object{
      var INSTANCE: User
   }
}
class ClassA{
   fun doStuff(){
       val classB = ClassB(UserHolder.INSTANCE)
       classB.changeUser()
       val newName = UserHolder.INSTANCE.name // is it "initial name" or "My new name"?
   }
}
class ClassB(private val user: User){
   fun changeUser(){
       user.name = "My new name"
    }
}

newName是“初始名称”还是“我的新名字”,为什么?我知道如果我将一个对象传递给一个方法并更改其属性,那么在返回时,属性将会更新。但为什么它不适用于课程?是因为我们写'val用户'吗?

答案

Is Kotlin "pass-by-value" or "pass-by-reference"?中的答案中所述,当您将对象传递给函数时,您会传递引用的副本。通过此引用,您可以修改传递的对象。

你无法修改Instance.name的原因是因为你宣布User.namevalval用于只读属性,无法更改,因此无法重新分配。

如果将其更改为var,则可以对其进行修改。见https://try.kotlinlang.org/#/UserProjects/7t8j73oqdtiin3ja8atbdq15op/lhiik2ek7otonb3kklpk33jclg

class User{
   var name: String = "initial name"
}
class UserHolder{
   companion object{
      var INSTANCE : User = User()
   }
}
class ClassA{
   fun doStuff(){
       val classB = ClassB(UserHolder.INSTANCE)
       classB.changeUser()
       val newName = UserHolder.INSTANCE.name // is it "initial name" or "My new name"?
   }
}
class ClassB(private val user: User){
   fun changeUser(){
       user.name = "My new name"
    }
}

fun main(args : Array<String>){
    System.out.println(UserHolder.INSTANCE.name)
    val classA = ClassA()
    classA.doStuff()
    System.out.println(UserHolder.INSTANCE.name)
}

打印:

initial name
My new name

以上是关于在Kotlin中,如果将对象传递给类的新实例,然后更改某些属性,它是否会在原始对象中更改?的主要内容,如果未能解决你的问题,请参考以下文章

在实例化时将对象传递给 Fragment 或 DialogFragment

尝试将对象传递给同一个模板类进行复制

创建将对象传递给实例方法的 NSPredicate

将对象传递给另一个类的构造函数

您可以使用 ctypes 通过其内存 id 将对象传递给 celery 任务吗?

C++ 将对象传递给函数