让我们在Java中考虑以下代码。
package obj;
final class First
{
public int x;
public First(int x)
{
this.x=x;
}
}
final class Second
{
public Second(First o)
{
o.x=10;
}
}
final public class Main
{
public static void main(String[] args)
{
First f=new First(50);
Second s=new Second(f);
System.out.println("x = "+f.x);
}
}
在上面的代码中,我们通过语句First f=new First(50);
提供值50,该语句被分配给类型为 int 的类成员 x 类第一个中的构造函数体。
在第二类中,第一类的对象 f 正在通过语句第二个s =新第二个(f); 我们正在修改该对象中保存的实例变量 x 的值为10,这将影响原始对象 f ,因为在Java对象中总是通过引用传递而不是通过值传递。
在某些特定情况下,不允许对原始对象进行此类更改可能至关重要。 Java中是否有任何机制可以阻止我们进行此类修改? (这可能允许我们按值传递对象)
答案 0 :(得分:9)
不,Second
中根本没有传递该对象。 引用按值传递。
Java 总是使用pass-by-value,但任何表达式的值只是一个原始类型或引用 - 永远不是一个对象。
听起来您想要创建现有对象的副本,然后将对该新对象的引用传递给该方法(按值)。构成“副本”的构成将取决于班级中的数据。 (你可能可以使用浅色副本,或者你可能需要更深入等等。)
答案 1 :(得分:3)
不,没有。我会说你的例子并不是一个很好的例子:如果你想确保某些事情没有改变,就不要提供改变它的方法。导致之后失去的改变最多会产生误导。
答案 2 :(得分:0)
First f=new First(50);
Second s=new Second(f);
在第一行中,您将创建对象类型First
的引用变量,在第二行中,它将传递给Class Second
正如Jon Skeet在java中所说的那样“Java总是使用pass-by-value,但任何表达式的值只是一个原始类型或引用 - 永远不是一个对象。”
如果你不想改变属性的值,那么你必须传递类First
的新对象
因为如果你有任何类的引用,那么你可以改变该类的属性。
或者你可以创建该对象的副本,最后创建一个First Class