Mah*_*ine 10 java reference pass-by-reference
我想在Java中使用引用,但我不知道如何!例如在C++中我们写道:
void sum(int& x)
{
...
}
Run Code Online (Sandbox Code Playgroud)
但在Java和sign中是一个编译器错误!请帮我理解Java中的参考资料.
jos*_*efx 10
默认情况下通过引用传递对象通过引用访问对象,但是无法创建对原始值(byte,short,int,long)的引用.您必须创建一个对象来包装整数或使用单个元素数组.
public void sum(int[] i){
i[0] = ...;
}
Run Code Online (Sandbox Code Playgroud)
要么
public void sum(MyInt i){
i.value = ...;
}
public class MyInt{
public int value;
}
Run Code Online (Sandbox Code Playgroud)
对于你的例子,类似下面的东西可以工作
public int sum(int v){
return ...;
}
Run Code Online (Sandbox Code Playgroud)
要么
public int sum(){
return ...;
}
Run Code Online (Sandbox Code Playgroud)
更新:
对象引用的附加/更好描述:
始终通过引用访问Java对象.与原始类型一样,此引用按值传递(例如,复制).由于程序员可以在java中访问的所有内容都是通过复制它(引用,基元)来传递的,并且无法创建对基本类型的引用,因此对方法参数(引用,基元)的任何修改只会影响其中的本地副本.方法.可以在方法中修改对象,因为引用的两个副本(本地和其他)仍然指向同一个对象实例.
例:
修改方法中的基元,这只影响i的内部副本而不是传递的值.
void primitive(int i){
i = 0;
}
Run Code Online (Sandbox Code Playgroud)
修改方法中的引用,这只影响ref的内部副本而不是传递的值.
void reference(Object ref){
ref = new Object();//points to new Object() only within this method
}
Run Code Online (Sandbox Code Playgroud)
修改全局可见的对象
void object(List l){
l.add(new Object());//modifies the object instead of the reference
}
Run Code Online (Sandbox Code Playgroud)
上面的数组和MyInt都基于对象的修改.
普通的Java参数已经更接近于C++引用而不是C++传值或传递指针.所以,你所有的Java方法都是这样的.
但是,int和其他原语在Java中是特殊的; 以上内容适用于对象引用.
编辑:更准确地说,如@fatih所述,所有Java调用都是按值传递的.但是,当您传递一个对象时,您将按值传递引用.因此,作为第一个近似值,上述语句是正确的:普通Java参数更类似于C++引用而不是C++传值或传递指针.
理解 Java 传递值语义的必读读物:
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;
}
}
Run Code Online (Sandbox Code Playgroud)