如何在Java中通过引用调用?

Sha*_*han 28 java function-calls

由于Java不支持指针,如何通过Java中的引用调用函数,就像在C和C++中一样?

Sea*_*oyd 37

Java中不可能实现真正的传递.Java按值传递所有内容,包括引用.但您可以使用容器对象模拟它.

使用以下任何方法作为方法参数:

  • 数组
  • 一个集合
  • 一个AtomicXYZ类

如果您在方法中更改其内容,则更改的内容将可用于调用上下文.


哎呀,你显然是指通过引用调用方法.这在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");
    }
}
Run Code Online (Sandbox Code Playgroud)

使用Foo在你的代码,这样你就可以很容易地替换SomeFoo使用OtherFoo.

  • 我认为你的意思是传递参考.我认为OP正在询问call-a-method-using-a-reference-to-the-method.;) (2认同)

Ste*_*n C 12

如何在Java中通过引用调用?

您无法通过Java中的引用进行调用.期.什么都没有接近.并且通过值传递引用与通过引用调用不同.

(真正的"通过参考调用"允许你做这样的事情:

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"
Run Code Online (Sandbox Code Playgroud)

你根本无法用Java做到这一点.)


既然Java不支持指针......

虽然这在技术上是正确的,但它不会妨碍你想要做的事情.

Java 确实支持引用,它们在最重要的方面就像指针一样.不同之处在于,您不能通过对引用进行算术处理,将引用转换为整数类型等等来将引用视为内存地址.并且您无法创建对变量的引用,因为Java或JVM体系结构中不存在该概念.


如何在Java中通过引用来调用函数,就像在C和C++中一样?

在Java中,函数(方法)和函数引用不支持作为值.因此,您不能将它们作为参数传递,也不能将它们分配给变量.

但是,您可以使用一个实例方法定义一个类,并使用该类的实例而不是函数引用.其他答案举例说明了这种方法.

  • 有些人可能会发现这篇博文有用:http://javadude.com/articles/passbyvalue.htm (2认同)