如何将对象传递给java中的方法(通过值或引用)?

时间:2012-09-14 17:43:21

标签: java

  

可能重复:
  Is Java “pass-by-reference”?

我想知道如何通过java中的referance将对象作为参数传递给方法。 我试过这段代码

public class Class1 
{
    public Class1()
    {
        String x = null;
        F(x);
        //x = null
        System.out.println("x = " + x);
    }

    void F(String x)
    {
        x = "new String";
    }

    public static void main(String[] args)
    {
        new Class1();
    }
}

你可以看到我将String传递给函数F并且我在其中更改了String的值,但是我看不到我在函数F之外对其做出的更改。当我执行此代码时,我得到//{x = null}这不是我期望的//{x = new String}

4 个答案:

答案 0 :(得分:9)

对象本身是通过引用传递的,但引用是按值传递的。

这意味着您可以更改函数中的对象,即您可以更改其字段,调用更改其状态的对象上的方法等。

您正在尝试更改函数中的引用。该引用只是一个副本。

另请注意,String是不可变类型。因此,即使使用它的引用,也无法更改基础Object

答案 1 :(得分:2)

Java按值而不是通过引用传递参数。查看我的answer on another question for an explanation by figures

但是,您可以通过以下方式实现目标:

1-使用数组:

public class Class1 
{
    public Class1()
    {
        String x = null;
        String[] holder = {x};
        F(holder);
        //x = null
        System.out.println("x = " + holder[0]);
    }

    void F(String[] holder)
    {
        holder[0] = "new String";
    }

    public static void main(String[] args)
    {
        new Class1();
    }
}

2-使用包装类:

class WrapperClass
{
    public String value;
}
public class Class1 
{
    public Class1()
    {
        String x = null;
        WrapperClass w = new WrapperClass();
        w.value = x;
        F(w);
        //x = null
        System.out.println("x = " + w.value);
    }

    void F(WrapperClass wrapper)
    {
        wrapper.value = "new String";
    }

    public static void main(String[] args)
    {
        new Class1();
    }
}

答案 2 :(得分:2)

Java对象通过引用传递。意味着当您创建对象并将其分配给引用(变量)时,其地址将分配给它。当您在被调用函数中修改它时,它会修改传递的相同对象。但在你的情况下,你已经传递了null,它与任何对象都没有关联。

请参阅我的示例以获得清晰的想法。

public class Class1 {
public Class1() {
    StringBuffer x = new StringBuffer("Before");
    F(x);
    // x = null
    System.out.println("x = " + x);
}

void F(StringBuffer x) {
    x.append("After");
}

public static void main(String[] args) {
    new Class1();
}

}

答案 3 :(得分:0)

你不能这样,因为sting是不可变的,不可更改。你可以使用StringBuffer它是mmutable.ok

class One
{
    One()
    {
        StringBuffer x =new StringBuffer("null");
        F(x);
        //x = null
        System.out.println("x = " + x);
    }

    void F(StringBuffer x)
    {
        x = x.delete(0,4);
        x=x.append("new string");   
    }

    public static void main(String[] args)
    {
        new One();
    }
}