我会从你的第一个问题开始一步步回答你:
在 Java 中,当一个类或对象的实例被指定为
方法的参数,正在制作该对象的副本
这是 false,当您将对象传递给方法时,Java 永远不会复制它,正如 Davide Lorenzo 所说,您正在传递对对象的引用,不是对象本身,因此如果该方法修改了类的某些属性,那么您的值也会在该方法之外进行修改。
所以我们可以回答第二个和第三个问题:
我知道 Java 中的函数是按值传递的,这意味着
正在制作对象的副本?
不,Java 不会复制。正如 Davide Lorenzo 所说,您传递的是引用的副本而不是对象的副本。
但同时,如果 java 对象是引用并且你传递了一个
参考,这与实际数据的副本不同吗?
是的,传递引用与传递对象的副本确实不同。
我将举例说明一切。
假设我们有一个具有 color
属性的对象
Flower
public class Flower{
String color = "red";
}
enter code here
我们可以想象AnotherObject的方法setColor
public void setColor(Flower flower, String color_string){
flower.color = color_string;
}
我们可以有以下情况
public static void main(String args[]){
Flower myFlower = new Flower();
AnotherObject otherObject = new AnotherObject();
otherObject.setColor(myFlower, "yellow");
System.out.println("The color of the flower is: "+myFlower.color);
}
这段代码的输出将是:
The color of the flower is yellow
这就是为什么你要传递对象的引用,而不是对象本身。
现在您可以问为什么 Java 被视为 按值传递?
在this previous post 上有一个非常有趣的讨论,我会引用它的最佳答案:
Java 总是按值传递。不幸的是,他们决定打电话
指针引用,从而使新手感到困惑。因为那些参考
按值传递。
最后但并非最不重要的一点是,只有原始类型不是通过 Java 中的引用来管理的,所以传递 int 与传递 Integer 确实不同,我建议你看看this post关于这个论点。