我想知道如何通过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}
。
答案 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();
}
}