在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.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
以上是关于在Kotlin中,如果将对象传递给类的新实例,然后更改某些属性,它是否会在原始对象中更改?的主要内容,如果未能解决你的问题,请参考以下文章
在实例化时将对象传递给 Fragment 或 DialogFragment