可以通过值传递对象而不是通过Java中的引用传递对象吗?

时间:2011-11-09 11:33:48

标签: java

让我们在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中是否有任何机制可以阻止我们进行此类修改? (这可能允许我们按值传递对象)

3 个答案:

答案 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

的新对象