我想在Java中使用引用,但我不知道如何! 例如,在C ++中我们写道:
void sum(int& x)
{
...
}
但是在Java& sign是编译错误! 请帮我理解Java中的参考资料。
答案 0 :(得分:9)
默认情况下通过引用传递对象通过引用访问对象,但是没有办法创建对原始值的引用(byte,short,int,长)。您必须创建一个对象来包装整数或使用单个元素数组。
public void sum(int[] i){
i[0] = ...;
}
或
public void sum(MyInt i){
i.value = ...;
}
public class MyInt{
public int value;
}
对于您的示例,以下内容可以起作用
public int sum(int v){
return ...;
}
或
public int sum(){
return ...;
}
<强>更新强>
对象引用的附加/更好描述:
始终通过引用访问Java对象。与原始类型一样,此引用按值传递(例如复制)。由于程序员可以在java中访问的所有内容都是通过复制它(引用,基元)来传递的,并且无法创建对基本类型的引用,因此对方法参数(引用,基元)的任何修改只会影响其中的本地副本。方法。 可以在方法中修改对象,因为引用的两个副本(本地和其他)仍然指向同一个对象实例。
示例:
修改方法中的基元,这只会影响i的内部副本,而不会影响传递的值。
void primitive(int i){
i = 0;
}
修改方法中的引用,这只会影响ref的内部副本,而不会影响传递的值。
void reference(Object ref){
ref = new Object();//points to new Object() only within this method
}
修改一个全局可见的对象
void object(List l){
l.add(new Object());//modifies the object instead of the reference
}
上面的数组和MyInt都基于对象的修改。
答案 1 :(得分:7)
普通的Java参数已经更接近于C ++引用而不是C ++传值或传递指针。所以,你所有的Java方法都是这样的。
然而,int 和其他原语在Java中是特殊的;以上内容适用于对象引用。
编辑:更准确地说,如@fatih所述,所有Java调用都是按值传递的。但是,当您传递一个对象时,您将按值传递引用。因此,作为第一个近似值,上述语句是正确的:普通Java参数更类似于C ++引用,而不是C ++传值或传递指针。
答案 2 :(得分:3)
理解Java的Pass By Value语义所需的阅读:
http://www.javaworld.com/javaworld/javaqa/2000-05/03-qa-0526-pass.html http://javadude.com/articles/passbyvalue.htm http://javachannel.net/wiki/pmwiki.php/FAQ/PassingVariables(链接到其他几个页面)
从头脑中完全删除Java可以通过引用传递任何内容的概念。我们来看一个例子,不管吗?
public class App
{
public static void main( String[] args )
{
Foo f1 = new Foo();
doSomethingToFoo(f1);
System.out.println(f1.bar); //Hey guess what, f1.bar is still 0 because JAVA IS PASS BY VALUE!!!
}
static void doSomethingToFoo(Foo f) {
f = new Foo();
f.bar = 99;
}
static class Foo {
int bar = 0;
}
}
答案 3 :(得分:0)
Apache Commons中的MutableInt
类可以做您想要的,尽管它并不漂亮。
void sum(MutableInt mx)
{
int x = mx.getValue();
x = ...
mx.setValue(x);
}
...
MutableInt mx = new MutableInt(5);
sum(mx);
int result = mx.getValue();
为其他基本类型和对象提供了附加类。
仅仅为了提供引用而创建附加对象会涉及一些开销,因此该解决方案不是最佳选择,但是在大多数情况下,您应该没事。
通常,总是最好找到一种从方法返回结果的方法。不幸的是,Java只允许以这种方式返回一个值。