如何在Java中使用引用?
我想在Java中使用引用,但我不知道如何使用! 例如,在C++中,我们写:如何在Java中使用引用?,java,reference,pass-by-reference,Java,Reference,Pass By Reference,我想在Java中使用引用,但我不知道如何使用! 例如,在C++中,我们写: void sum(int& x) { ... } 但是在Java中&符号是一个编译器错误! 请帮助我理解java中的引用。< P>普通的java参数已经比C++ C++通过值或传递指针更接近C++引用。所以,您所有的Java方法都已经是这样了 然而,int和其他原语在Java中是特殊的;上述情况适用于对象引用 编辑:更准确地说,如@fatih所述,所有Java调用都是按值传递的。但是,当传递对象时,就
void sum(int& x)
{
...
}
但是在Java中&符号是一个编译器错误!
请帮助我理解java中的引用。< P>普通的java参数已经比C++ C++通过值或传递指针更接近C++引用。所以,您所有的Java方法都已经是这样了 然而,int和其他原语在Java中是特殊的;上述情况适用于对象引用
编辑:更准确地说,如@fatih所述,所有Java调用都是按值传递的。但是,当传递对象时,就是按值传递引用。因此,作为第一个近似,上述语句是正确的:普通的java参数比C++的值更接近于C++的值或传递指针。(byte,short,int,long)。您要么创建一个对象来包装整数,要么使用一个元素数组
public void sum(int[] i){
i[0] = ...;
}
或
对于您的示例,类似于以下内容的内容可能会起作用
public int sum(int v){
return ...;
}
或
更新:
对象引用的附加/更好描述:
Java对象总是通过引用进行访问。与原语类型一样,此引用也是通过值传递的(例如复制的)。由于程序员在Java中可以访问的所有内容都是通过复制来传递的(引用,原语),并且无法创建对原语类型的引用,因此对方法参数的任何修改(引用,原语)仅影响方法内的本地副本。
对象可以在方法中修改,因为引用的两个副本(本地和其他)仍然指向同一个对象实例
例如:
在方法中修改原语,这只影响i的内部副本,而不影响传递的值
void primitive(int i){
i = 0;
}
void reference(Object ref){
ref = new Object();//points to new Object() only within this method
}
在方法中修改引用,这只影响ref的内部副本,而不影响传递的值
void primitive(int i){
i = 0;
}
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都基于对对象的修改。理解Java的传递值语义的必读读物: http://javadude.com/articles/passbyvalue.htm (链接到其他几个页面) 完全消除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;
}
}
apachecommons中的
MutableInt
类可以做您想要做的事情,尽管它并不漂亮
为其他基元类型以及对象提供了其他类
仅仅为了提供引用而创建一个附加对象会带来一些开销,因此解决方案不是最优的,但在大多数情况下,您应该可以
一般来说,最好找到一种从方法返回结果的方法。不幸的是,Java只允许以这种方式返回一个值。“默认情况下对象是通过引用传递的”-这是错误的。在Java中,一切都是通过值传递的。令人困惑的是引用(非原语变量)也按值传递。请注意,按值传递引用与按引用传递对象不同。@Jesper这不是完全错误,java中的对象总是按引用传递。引用本身按值传递也是正确的。不能直接传递对象。非基元类型的变量是引用-它们是不是对象本身,就像C++一样。当你谈到java时,谈论“传递对象”是不精确的术语。@杰斯珀,你能为我定义“PASS”吗?看来我的英语技能不适合这个任务。“PASS”在这个上下文中意味着在方法调用中使用变量作为参数。但是这一点不在“PASS”这个词中。但是,在java中的变量是引用,而不是直接表示对象,就像C++一样。post@Esko,除了你不应该仅仅为了做一些小的修饰(比如纠正一个打字错误)而编辑帖子。我觉得@skaffman用那种“语气”发表他的评论很令人沮丧还有6个人投票认为这很有帮助。@Tim:事实上,我确实记得我读过几次与你刚才在官方博客和meta上说的完全相反的内容。在我看来,修正拼写和语法是被认可的,因为有时候这会让其他人更容易理解问题本身。@Esko,你是对的,但现在我更倾向于理解问题本身。@Eskoressed.如果删除读取
f=new Foo()
的行,可能会发生重复情况?我猜您将得到99而不是0。
void sum(MutableInt mx)
{
int x = mx.getValue();
x = ...
mx.setValue(x);
}
...
MutableInt mx = new MutableInt(5);
sum(mx);
int result = mx.getValue();