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

时间:2018-09-05 17:14:00

标签: kotlin

问题在标题中: 在Kotlin中,如果将对象传递到类的新实例中,然后更改了某些属性,是否会更改原始对象中的属性? 图片我遇到以下情况:

process = Runtime.getRuntime().exec("su");
            DataOutputStream os = new DataOutputStream(process.getOutputStream());
            cmd = "/system/bin/input tap 244 580\n";
            os.writeBytes(cmd);
            cmd = "/system/bin/input tap 244 580\n";
            os.writeBytes(cmd);
            os.writeBytes("exit\n");
            os.flush();
            os.close();
            process.waitFor();

newName是“初始名称”还是“我的新名称”,为什么? 我知道,如果我将对象传递给方法并更改其属性,则返回时属性将被更新。但是为什么它不能与这些类一起使用?是因为我们写了“ val user”吗?

1 个答案:

答案 0 :(得分:3)

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

之所以不能修改Instance.name是因为您将User.name声明为valval用于不可更改的只读属性,因此无法重新分配。

如果将其更改为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