作者:才女与尔同销万古愁 | 来源:互联网 | 2023-02-01 13:47
据我所知,Java是这篇文章的传值.我来自Java背景我想知道Kotlin用于传递两者之间的值.像在扩展或方法等.
1> Pelocho..:
每当我听到"传递价值"与"传递参考"Java辩论时,我总是这么认为.我给出的答案:"Java传递引用的副本(按值传递)"(传递引用).所以每个人都很开心.我会说Kotlin和基于JVM的一样
2> hasen..:
语义与Java相同.
在Java中,当您拥有对象的实例并将其传递给方法时,该方法可以更改该对象的状态,并且在该方法完成后,更改将应用于调用站点上的对象.
这同样适用于Kotlin.
3> s1m0nw1..:
它使用与Java相同的原理。它始终是按值传递的,您可以想象传递了一个副本。对于原始类型,例如,Int
这很明显,此类参数的值将被传递到函数中,并且外部变量将不会被修改。请注意,由于Kotlin中的参数的行为类似于val
s,因此无法重新分配:
fun takeInt(a: Int) {
a = 5
}
该代码将无法编译,因为a
无法重新分配。
对于对象来说,这有点困难,但它也是按值调用的。如果使用对象调用函数,则其引用的副本将传递给该函数:
data class SomeObj(var x: Int = 0)
fun takeObject(o: SomeObj) {
o.x = 1
}
fun main(args: Array) {
val obj = SomeObj()
takeObject(obj)
println("obj after call: $obj") // SomeObj(x=1)
}
您可以使用传递给函数的引用来更改实际对象。这将影响您传入的参数。但是,引用本身(即变量的值)将永远不会通过函数调用进行更改。
4> 小智..:
在Java原语类型(如int,float,double,boolean)中,它们按值传递给方法,如果您在接收器方法中对其进行修改,则它们不会更改为调用方法。但是,如果属性/变量类型不是基元,则像基元数组或其他类一样,当它们在方法内部更改并接收它们作为参数时,它们也会在调用方方法中更改。但是对于Kotlin来说,似乎没有什么是原始的,因此我认为所有内容都是通过引用传递的。