2010-03-24 115 views
5

在C++中,如果需要修改2个对象,则可以通过引用传递。你如何在java中完成这项工作?假设2个对象是基本类型,例如int。在Java中通过引用传递?

+0

这是http://stackoverflow.com/questions/589919/doe S-java的传递通过引用 – Zxaos 2010-03-24 00:20:06

回答

12

你不行。 Java不支持传递对变量的引用。一切都通过价值传递。

当然,当按值传递对象的引用时,它将指向同一对象,但这不是通过引用调用。

0

使用泛型,你可以创建一个指针类,这将至少有点痛苦。你传递对象,改变它的value属性,当函数退出时,你的对象将包含新的值。

MyPointerClass<int> PointerClass = new MyPointerClass<int>(5); 
myFunction(PointerClass); 
System.out.println(PointerClass.Value.toString()); 

// ... 

void myFunction(myPointerClass<int> SomeValue) 
{ 
    SomeValue.Value = 10; 
} 
1

Java没有引用传递,但您仍然可以从这些引用(它们本身通过值传递)中对象进行变异。

正如你可以看到,你仍然可以修改对象(如果它们不是不可变的);你不能通过将引用或基元传递给一个函数来修改它。

当然,你可以使它们成为一个对象的域,并通过那些对象,并将它们设置为任何你想要的。但是,这仍然没有通过参考。

2

将它们包装在一个对象中,然后将该对象作为参数传递给该方法。

例如,以下C++代码:

bool divmod(double a, double b, double & dividend, double & remainder) { 
    if(b == 0) return false; 
    dividend = a/b; 
    remainder = a % b; 
    return true; 
} 

可以在Java被重写为:

class DivRem { 
    double dividend; 
    double remainder; 
} 

boolean divmod(double a, double b, DivRem c) { 
    if(b == 0) return false; 
    c.dividend = a/b; 
    c.remainder = a % b; 
    return true; 
} 

虽然在Java中更惯用的风格是创建并从该方法返回该对象而不是接受它作为参数:

class DivRem { 
    double dividend; 
    double remainder; 
} 

DivRem divmod(double a, double b) { 
    if(b == 0) throw new ArithmeticException("Divide by zero"); 
    DivRem c = new DivRem(); 
    c.dividend = a/b; 
    c.remainder = a % b; 
    return c; 
}