问题在标题中: 在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”吗?
答案 0 :(得分:3)
如Is Kotlin "pass-by-value" or "pass-by-reference"?中答案中所述,将对象传递给函数时,将传递引用的副本。通过此参考,您可以修改传递的对象。
之所以不能修改Instance.name
是因为您将User.name
声明为val
。 val
用于不可更改的只读属性,因此无法重新分配。
如果将其更改为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