如何在Java中实现“按引用传递”?(假设我们使用这个术语的方式与自1960年以来同行评审的计算机科学文献中使用的方式相同;请参见这个维基百科页面以获取简单的解释。)
由于Java不支持指针,如何在Java中像在C和C++中一样通过引用调用函数?
如何在Java中实现“按引用传递”?(假设我们使用这个术语的方式与自1960年以来同行评审的计算机科学文献中使用的方式相同;请参见这个维基百科页面以获取简单的解释。)
由于Java不支持指针,如何在Java中像在C和C++中一样通过引用调用函数?
Java中不能真正实现按引用传递参数。Java将所有东西都按值传递,包括引用。但是你可以使用容器对象来模拟它。
在方法参数中使用以下任何内容:
如果在方法中更改其内容,则更改后的内容将在调用上下文中可用。
抱歉,您似乎是指通过引用调用方法。这在Java中也不可能实现,因为在Java中方法不是一级公民。这可能会在JDK 8中发生改变,但目前,您将需要使用接口来解决此限制。
public interface Foo{
void doSomeThing();
}
public class SomeFoo implements Foo{
public void doSomeThing(){
System.out.println("foo");
}
}
public class OtherFoo implements Foo{
public void doSomeThing(){
System.out.println("bar");
}
}
在你的代码中使用Foo
,这样你就可以轻松地将SomeFoo
替换为OtherFoo
。
void swap(ref int i, ref int j) { int tmp = *i; *i = *j; *j = tmp }
int a = 1;
int b = 2;
swap(a, b);
print("a is %s, b is %s\n", a, b); // -> "a = 2, b = 1"
::
语法支持方法引用。有4种方法引用的类型:
ContainingClass::staticMethodName
containingObject::instanceMethodName
ContainingType::methodName
ClassName::new
Collections.sort(list, new Comparator() {
@Override
public int compareTo(Object o1, Object o2) {
/// code
}
});
list
的方式是通过 list
的方法。如果参数是 int
,接口无法帮助。OP 指的是能够通过形式参数修改实际参数。 - jbrunipackage jgf;
public class TestJavaParams {
public static void main(String[] args) {
int[] counter1 = new int[1];
counter1[0] = 0;
System.out.println(counter1[0]);
doAdd1(counter1);
System.out.println(counter1[0]);
int counter2 = 0;
System.out.println(counter2);
doAdd2(counter2);
System.out.println(counter2);
}
public static void doAdd1(int[] counter1) {
counter1[0] += 1;
}
public static void doAdd2(int counter2) {
counter2 += 1;
}
}
0
1
0
0
// Pass a Runnable which calls the task() method
executor.submit(new Runnable() {
public void run() {
task();
}
});
public void task() { }
您可以使用反射来调用任何方法
Method method = MyClass.class.getMethod("methodToCall", ParameterType.class);
result = method.invoke(object, args);
public void foo(int[] in){
in[0] = 2;
}
int[] byRef = new int[1];
byRef[0] = 1;
foo(byRef);
// ==> byRef[0] == 2.
Java仅允许按值调用。但是,通过按值传递对象的引用可以将这些引用传递到被调用的函数中。如果在被调用的函数中使用这些引用来操纵对象的数据,则此更改也将在调用函数中可见。我们不能像指针一样对这些引用进行指针算术运算,但引用可以使用句点运算符指向对象的数据,该运算符在C/C ++中函数为'*'运算符。
来自Herbert Shildt的《Java完全参考手册》第9版:“当您将对象传递给方法时,情况会发生巨大变化,因为对象是通过有效的按引用调用方式传递的。请记住,当您创建一个类类型的变量时,您只是创建了一个对对象的引用。因此,当您将此引用传递给方法时,接收它的参数将引用与参数相同的对象。这实际上意味着对象表现得好像是通过按引用调用方式传递给方法的。在方法内部对对象所做的更改确实会影响作为参数使用的对象。”
package objectpassing;
public class PassObjectTest {
public static void main(String[] args) {
Obj1 o1 = new Obj1(9);
System.out.println(o1.getA());
o1.setA(3);
System.out.println(o1.getA());
System.out.println(sendObj1(o1).getA());
System.out.println(o1.getA());
}
public static Obj1 sendObj1(Obj1 o)
{
o.setA(2);
return o;
}
}
class Obj1
{
private int a;
Obj1(int num)
{
a=num;
}
void setA(int setnum)
{
a=setnum;
}
int getA()
{
return a;
}
}
操作: 9 3 2 2
最终调用getA()方法显示原始对象字段'a'在调用公共静态Obj1 sendObj1(Obj1 o)方法时已更改。
http://www.javaworld.com/javaqa/2000-05/03-qa-0526-pass.html
Java确实通过引用来操作对象,所有对象变量都是引用。但是,Java不通过引用传递方法参数;它是通过值传递的。
ref
和out
参数,这也可能对调用者施加限制)。C++ 的引用 "类型" 很奇怪,因为它使用普通的变量声明语法,甚至可以声明引用类型的结构成员,但它并不在存储分配意义上创建 "对象"。 - undefined